据我所知,javascript 不支持多线程。我想要一些关于以下情况的专家建议..

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

  • 我计划使用订阅/发布模式,是否可以订阅多个监听器到 AJAX 完成事件。
  • 如果可能的话,我想知道这些听众如何在发布时收到通知。(以多线程方式并行或一一并行)。

    并建议我实现这一目标的最佳方法..我真的很感激你的想法。

编辑::

我知道有像 JQuery 这样的流行框架支持这种模式。但我处于从头开始开发此功能的情况(我们有自己的框架)。

有帮助吗?

解决方案

我有一个请求池程序,它可能会给您一个良好的开端。[自从这个答案被接受以来,我已经退役了池化器,转而使用更完整的“AJAX Helper” - 链接已更新。]

我不确定这会做你想做的一切(尽管听起来可能很接近)。它很旧,但它有效:

郁闷按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);

它是开源的 - 您可以随意切割/折叠/旋转或毁坏它,直到您满意为止。

吉姆·戴维斯

其他提示

本文 非常仔细地描述了您想要完成的任务。本质上,您只有一个包含处理程序/订阅者数组的 JavaScript 文件。每个订阅者向发布者注册自己(即被添加到处理程序数组中)。然后,在 Ajax 调用的 onClose 处理程序中,您将调用一个迭代订阅者并按名称通知每个订阅者的函数:

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

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

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");

会调度队列

这是可能的,您确实应该使用一个库来避免所有浏览器不兼容的情况。例如 jQuery 提供 Ajax 功能,让您可以在 Ajax 调用完成时执行代码。看 这里 用于文档。

如果你想并行触发函数,请使用以下命令:

this.handlers = [];
...
 for(var i = 0; i < this.handlers.length; i++)
  {
    setTimeout(function(){this.handlers[i].eventHandler.call(this, eventArgs);},0);
 }
...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top