javascript - 哪些函数应该是异步的(放在 Node.js Promise 中)?

标签 javascript node.js asynchronous

我对这个主题的了解总体来说还很低,所以请耐心等待。

我知道可能需要额外延迟的功能(例如数据库读/写、文件读取等)应该异步运行,以免阻塞。

经过我的搜索后,还没有真正得到答案的是:

像简单的 for 循环之类的东西应该异步运行吗?它可能很简单:

function a() {
    var a = 0;  
    for(i=0; i<10000000; i++) {
        a++;
    };
};

由于这样的事情可能需要几毫秒,是否应该将其放入 Node.js Promise 中?

我是否正确地假设,如果我不这样做,那么就会出现阻塞,尽管只有几毫秒?

最佳答案

我不确定我的理解是否正确,但我认为这不会像你期望的那样工作。 “包装”该函数在 future 中将使调用异步,但不会使函数本身异步。

假设以下场景:

f1();
a();
f2();
f3();
// (...)

如果a()是同步的,f2()只会在a()完成后执行(即你的for循环)。现在,如果 a() 是异步的,这意味着 f2() 将立即执行,因此它不会阻止执行。

但是由于 NodeJS 是单线程的,并且所有代码都在循环中执行,因此每当执行 for 循环时,它都会从头到尾(从迭代 0 到 9999999)不间断地运行,因此它会阻塞期间的其他操作那个时候。

因此,使用 Promise,您只会在该代码阻止您的应用程序时进行延迟。

如果该函数只需要几毫秒即可完成,那可能不会产生很大的差异。但是,如果需要几秒或几分钟的时间,您需要确保该任务不时使用 nextTick 或使用 async.eachSeries 之类的东西将控制权交还给 NodeJS。 .

This article解释这是一些细节。

关于javascript - 哪些函数应该是异步的(放在 Node.js Promise 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546226/

相关文章:

javascript - MailApp 无法发送大量收件人

javascript - 使用带有快速服务器的文件

node.js - 保护 Socket.io

node.js - linux/node.js 上的异步调用消耗了哪些资源

c# - SMTP.SendAsync 无法正常工作

javascript - 如何确定Ajax(XHR)请求发送者?

javascript - JQuery If Else 语句从未执行过

jquery - 异步 QUnit + Mockjax 测试中相同调用的多个响应

javascript - Highcharts,5个小图表,有些随机不绘制

javascript - NodeJS 堆栈跟踪中缺少函数名称;为什么?