javascript 中的多线程和订阅/发布方法
-
13-09-2019 - |
题
据我所知,javascript 不支持多线程。我想要一些关于以下情况的专家建议..
我的要求是执行 AJAX 调用,成功完成后,我想触发一组事件(并行更新 UI 的不同部分)
- 我计划使用订阅/发布模式,是否可以订阅多个监听器到 AJAX 完成事件。
如果可能的话,我想知道这些听众如何在发布时收到通知。(以多线程方式并行或一一并行)。
并建议我实现这一目标的最佳方法..我真的很感激你的想法。
编辑::
我知道有像 JQuery 这样的流行框架支持这种模式。但我处于从头开始开发此功能的情况(我们有自己的框架)。
解决方案
我有一个请求池程序,它可能会给您一个良好的开端。[自从这个答案被接受以来,我已经退役了池化器,转而使用更完整的“AJAX Helper” - 链接已更新。]
我不确定这会做你想做的一切(尽管听起来可能很接近)。它很旧,但它有效:
它支持具有超时/重试、每个请求处理程序的多个并发请求,占用空间非常小,并且可以轻松与其他代码组合。
您创建一个池(告诉它允许有多少个并发请求),然后向它抛出请求。当他们完成后,他们会调用您指定的任何处理程序。
一个小而完整的使用示例:
// 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");
会调度队列
如果你想并行触发函数,请使用以下命令:
this.handlers = [];
...
for(var i = 0; i < this.handlers.length; i++)
{
setTimeout(function(){this.handlers[i].eventHandler.call(this, eventArgs);},0);
}
...
不隶属于 StackOverflow