gpt4 book ai didi

javascript jquery deferred 无法与worker一起使用?

转载 作者:行者123 更新时间:2023-12-02 17:21:12 25 4
gpt4 key购买 nike

我有以下 JavaScript 代码:

var promises = [];

// Entries contains an unknown amount of items. For the sake of this
// sample, it has five.
$.each(entries, function() {
promises.push(doProcessing());
});

return $.when.apply($, promises).done(function() {
alert('success');
}).fail(function() {
alert('failed');
});

如果我的 doProcessing 函数是:

function doProcessing() {
var def = $.Deferred();

setTimeout(function () {
console.log('Request completed');
def.resolve();
},2000);

return def.promise();
} // End of doProcessing

我收到五次请求已完成日志,然后是“成功”警报。如果我将 doProcessing 方法更改为:

function doProcessing() {
var def = $.Deferred();

// Worker has a message
myWorker.onmessage = function(event) {
console.log('Worker finished');
def.resolve();
console.log(def);
};

myWorker.postMessage({action:'doSomething'});

return def.promise();
} // End of doProcessing

如果我的工作人员现在正在进行一些处理并解决延迟问题,那么我将不再收到成功警报。我确实收到了五条 Worker finish 消息,并且我的 def 对象也已注销。

我不确定我在这里做错了什么。有人能指出我正确的方向吗?

最佳答案

I DO get five Worker finished messages, and my def object is also logged out.

但它是同一个 def 对象。通过

 myWorker.onmessage = function(event) {

}

您正在覆盖 .onmessage 属性,并且只有最后一个监听器将被所有 5 个事件调用。相反,做类似的事情

worker.messages = 0;
function doProcessing() {
var def = $.Deferred(),
id = worker.messages++;

// Worker has a message
myWorker.addEventListener("message", function l(event) {
if (event.data.id != id) return; // It's not for us!
console.log('Worker '+id+' finished');
def.resolve(event.data);
worker.removeEventListener(l);
});

myWorker.postMessage({action:'doSomething', id:id});

return def.promise();
}

并调整工作代码,以便将 id 传回。

关于javascript jquery deferred 无法与worker一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23938201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com