我最近深入研究了 NodeJS 的内部结构,需要对其队列和事件循环进行一些澄清。
NodeJS 是单线程的,所以如果我有一个函数:findTheMeaningOfLife()
这是同步函数,将按原样调用它,可能需要一段时间才能得到 42
.
但是如果我将此函数包装在 Promise
中,它将如何表现?例如:
function findTheMeaningOfLifeAsync(){
return new Promise(function(resolve, reject){
try {
var meaningOfLife = findTheMeaningOfLife();
resolve(meaningOfLife);
} catch (error) {
reject(error);
}
})
}
并且会调用它,它会被放置在 NodeJS (libuv) 队列中并在不同的线程中调用吗?如果不是,我怎样才能让它真正异步?
提前谢谢您。
最佳答案
首先澄清一下:Node Js 不是单线程的,它有一个执行线程和多个服务线程(后者用于 I/O 操作)。
话虽如此,您建议的代码的典型行为如下:
- 您可以使用
.then()
处理程序从外部调用findTheMeaningOfLifeAsync()
。 - 被调用的函数立即返回一个 Promise,调用者函数等待该 Promise 解析并继续执行。
- 当调用函数等待时,执行线程中会继续处理其他事件,因此整个事件循环不会停止。
- 一旦被调用函数完成执行,它将向调用函数返回 Promise 解析。
- 调用者函数现在将使用 Promise 解析的结果恢复执行。
因此,关于您的主要问题,利用 promise 将以某种方式监视当前状态并等待解决,然后再从保存的点恢复。然而,这并不涉及多线程的使用(因为我假设在这种情况下不包括 I/O 操作),而是使用事件来提供异步编程。我建议您查看 Node Js 事件以便有更深入的了解。我在这里为您提供一个有用的链接: NodeJs Events
关于node.js - 在 NodeJS 中异步使用同步进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45207527/