JavaScript 同步回调



我正在寻找是否有一种方法可以获取通用的异步函数,例如 AJAX 或消息上的 Web worker 并强制它同步运行。

首先 - 我

确实需要这种行为,我知道所有关于异步回调与返回的论点 - 但在这种情况下,我真的需要等待回调。

如果没有可用的通用解决方案,我会选择纯粹适用于Worker.prototype.onmessage的解决方案,因为这是这里的主要用例。

我很确定答案是"这是不可能的",但我想在投降前检查一下。

我已经研究了承诺和生成器,我宁愿不使用第三方库(我知道 Node 的光纤/期货)。

一个潜在的用例:

function main(){
    worker = new Worker("someWorker.js")
    var result = worker.onmessage(function(event){
        return event.data;
    })
    //wait for worker.onmessage
    return result;
}

如果要保留函数的同步流,生成器函数是唯一可能的解决方案。您将发送所有异步任务,例如 var result = yield new Worker('someWorker.js') .

function* main之外,您将获得带有mainFn.next().valueworker,然后附加onmessage侦听器,该侦听器会将解析的数据返回到function* main中,并且该功能将恢复。

完整的生成器示例如下所示

// write function as generator
function* main () {
    var result = yield new Worker("someWorker.js");
    return result;
}
// instantiate the generator and get the first yield value
var mainFn = main()
  , worker = mainFn.next().value
// set onmessage listener, which is callback, that sends data back to *main()
worker.onmessage = function(event) {
    mainFn.next(event.data);
}

这样,您的main()函数将保持与原始形式几乎相似,因此您可以重用原始代码,但您需要编写周围的逻辑,这并不简单,无论如何都会使用回调。

你似乎知道生成器是什么,并且在浏览器中没有广泛支持它,所以如果你想在网页上运行这段代码,你需要 ES6 转译器 Babel。

最新更新