代码之家  ›  专栏  ›  技术社区  ›  RameshVel

javascript中的多线程和订阅/发布方法

  •  1
  • RameshVel  · 技术社区  · 15 年前

    我知道在javascript中没有多线程支持。我想在下面的场景中得到一些专家的建议。

    我的要求是执行Ajax调用,成功完成后,我希望触发一组事件(以并行更新UI的不同部分)

    • 我计划使用订阅/发布模式,是否可以为Ajax完成事件订阅多个列表器。
    • 如果可能的话,我想知道这些上市公司是如何在发布时通知的。(多线程并行或逐个并行)。

      并向我推荐实现这一目标的最佳方法。我真的很感激你的想法。

    编辑:

    我知道有一些流行的框架,比如jquery支持这种模式。但是现在正处于从零开始开发这个功能(我们有自己的框架)。

    5 回复  |  直到 11 年前
        1
  •  3
  •   Jim Davis    11 年前

    我有一个请求,普勒,可能会给你一个良好的开端。[自从这个答案被接受后,我就退出了pooler,转而使用更完整的“ajax助手”-链接已经更新。]

    我不确定这会满足你的所有要求(尽管听起来可能很接近)。它是旧的,但它起作用:

    Depressed Press DP_AJAX

    它支持多个具有超时/重试的同时请求,每个请求处理程序的占用空间非常小,可以轻松地与其他代码组合。

    您创建一个池(告诉它允许多少同时请求),然后向它抛出请求。完成后,它们调用您指定的任何处理程序。

    一个完整的小例子:

            // The handler function
    function AddUp(Num1, Num2, Num3) {
        alert(Num1 + Num2 + Num3);
    };
    
        // Instantiate the Pool
    myRequestPool = new DP_RequestPool(4);
    
        // Start the Interval
    myRequestPool.startInterval(100);
    
        // Create the Request
    myRequest = new DP_Request(
        "GET",
        "http://www.mysite.com/Add.htm",
        {"FirstNum" : 5, "SecondNum" : 10},
        AddUp,
        [7,13]);
    
        // Add the request to the queue
    myRequestPool.addRequest(myRequest);
    

    它是开放源码的-你可以随意切碎/折叠/纺锤或切碎它以满足你的心。

    吉姆戴维斯

        2
  •  3
  •   yalestar    15 年前

    This article 描述了您正在努力实现的目标。实际上,您只有一个JavaScript文件,其中包含一系列处理程序/订阅服务器。每个订阅服务器向发布服务器注册自己(即添加到处理程序数组)。然后,在Ajax调用的onClose处理程序中,您将调用一个函数,该函数在订阅服务器上迭代并按名称通知每个订阅服务器:

    this.handlers = [];
    ...
     for(var i = 0; i < this.handlers.length; i++)
      {
        this.handlers[i].eventHandler.call(this, eventArgs);
     }
    ...
    
        3
  •  2
  •   ata    14 年前

    这可以作为一个轻量级的消息传递框架吗?

    function MyConstructor() {
        this.MessageQueues = {};
    
        this.PostMessage = function (Subject) {
            var Queue = this.MessageQueues[Subject];
            if (Queue) return function() {
                                            var i = Queue.length - 1;
                                            do Queue[i]();
                                            while (i--);
                                        }
            }
    
        this.Listen = function (Subject, Listener) {
            var Queue = this.MessageQueues[Subject] || [];
            (this.MessageQueues[Subject] = Queue).push(Listener);
        }
    }
    

    然后你可以做:

    var myInstance = new MyConstructor();
    myInstance.Listen("some message", callback());
    myInstance.Listen("some other message", anotherCallback());
    myInstance.Listen("some message", yesAnotherCallback());
    

    后来:

    myInstance.PostMessage("some message");
    

    会排好队吗

        4
  •  0
  •   ujh    15 年前

    这是可能的,您应该使用一个库来避免所有浏览器不兼容。例如 jQuery 提供Ajax功能,允许您在完成Ajax调用时执行代码。参见 here 文件。

        5
  •  0
  •   Eldar Djafarov    15 年前

    如果要在Parralell中激发函数,请使用以下命令:

    this.handlers = [];
    ...
     for(var i = 0; i < this.handlers.length; i++)
      {
        setTimeout(function(){this.handlers[i].eventHandler.call(this, eventArgs);},0);
     }
    ...