小编qui*_*cVO的帖子

如何同步访问 Promise 的结果?

让我从我喜欢异步代码的事实开始。我永远不会在生产中将异步代码包装在同步包装器中,但这仍然是我想学习如何做的事情。我指的是 Node.JS,而不是浏览器。有很多方法可以同步访问异步函数的结果,例如使用child_process.spawnSync或工作器和Atomics。这些方法的问题是:

let prom = Promise.resolve(4);
// It is now impossible (as far as I know) to access the result of prom synchronously
Run Code Online (Sandbox Code Playgroud)

Promise 无法在调用中发送postMessage,因此工作人员无法访问它们并等待它们同步完成或根本无法完成。有人可能会想,为什么不这样做:

let prom = Promise.resolve(4);
prom.then(res => global.result = res);
while (!global.result) {}; // Do nothing
// Once the loop finishes, the result *would* be available
console.log(global.result); // => 4
Run Code Online (Sandbox Code Playgroud)

当然,这是行不通的。事件循环在开始处理 的回调函数之前等待完全执行 while 循环prom.then。这会导致无限循环。所以这让我问,“是否有一个同步任务必须非正常执行才能等待承诺?”

编辑
顺便说一句,我完全理解async/await。如果我使用 Node.JS 模块,那么我可以这样做:

let resolved = await prom;
Run Code Online (Sandbox Code Playgroud)

或者,如果我不是,我可以将整个脚本包装在一个 …

javascript event-loop synchronous node.js promise

6
推荐指数
1
解决办法
5385
查看次数

标签 统计

event-loop ×1

javascript ×1

node.js ×1

promise ×1

synchronous ×1