node.js - 在 NodeJS 中异步使用同步进程

标签 node.js multithreading asynchronous event-loop libuv

我最近深入研究了 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 操作)。

话虽如此,您建议的代码的典型行为如下:

  1. 您可以使用 .then() 处理程序从外部调用 findTheMeaningOfLifeAsync()
  2. 被调用的函数立即返回一个 Promise,调用者函数等待该 Promise 解析并继续执行。
  3. 当调用函数等待时,执行线程中会继续处理其他事件,因此整个事件循环不会停止。
  4. 一旦被调用函数完成执行,它将向调用函数返回 Promise 解析。
  5. 调用者函数现在将使用 Promise 解析的结果恢复执行。

因此,关于您的主要问题,利用 promise 将以某种方式监视当前状态并等待解决,然后再从保存的点恢复。然而,这并不涉及多线程的使用(因为我假设在这种情况下不包括 I/O 操作),而是使用事件来提供异步编程。我建议您查看 Node Js 事件以便有更深入的了解。我在这里为您提供一个有用的链接: NodeJs Events

关于node.js - 在 NodeJS 中异步使用同步进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45207527/

相关文章:

javascript - Nodejs 并行异步调用,但有优先权

python - 如何在Django、Python中异步显示图片?

node.js - Mongoose 保存错误

javascript - 如何使用 AWS Lambda 中的 websockets 将响应发送回客户端

javascript - 如何在客户端中从 Meteor.call() 分配外部值?

java - JavaFX 后台线程的问题

python - 使用 python 和 tkinter 实时绘制串行数据

javascript - 这段将多个js文件合并为一个的代码有什么问题吗?

javascript - promise 中的返回声明

java - 线程 "main"中的异常持久性已在使用中