1

我知道 javascript 中没有多线程支持。我想要一些关于以下场景的专家建议..

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

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

    并建议我实现这一目标的最佳方法。我非常感谢你的想法。

编辑::

我知道有像 JQuery 这样的流行框架支持这种模式。但是我可以从头开始开发这个功能(我们有自己的框架)。

4

5 回答 5

3

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

this.handlers = [];
...
 for(var i = 0; i < this.handlers.length; i++)
  {
    this.handlers[i].eventHandler.call(this, eventArgs);
 }
...
于 2009-08-13T13:52:19.897 回答
3

我有一个 Request Pooler,它可能会给你一个良好的开端。[自从这个答案被接受后,我已经停用了 pooler,转而使用更完整的“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);

它是开源的 - 随意砍/折叠/纺锤或破坏它,以满足您的内心需求。

吉姆戴维斯

于 2009-08-13T21:14:54.183 回答
2

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

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

将调度队列

于 2010-06-28T16:07:32.123 回答
0

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

于 2009-08-13T13:43:06.457 回答
0

如果您想在 parralell 中触发函数,请使用以下命令:

this.handlers = [];
...
 for(var i = 0; i < this.handlers.length; i++)
  {
    setTimeout(function(){this.handlers[i].eventHandler.call(this, eventArgs);},0);
 }
...
于 2009-08-13T14:04:30.707 回答