【问题标题】:Is node.js asynchronous by default?node.js 默认是异步的吗?
【发布时间】:2020-09-11 06:26:19
【问题描述】:

我精通 node.js,从事 JS 工作 2 年了。但是我仍然对节点中的异步性质感到困惑。看看下面的代码

// Synchronous Code:

function foo() {
    const result1 = bar();
    console.log(result1);

    const result2 = see();
    console.log(result2);
}
function bar() {
    return 'bar';
}
function see() {
    return 'see'
}
foo();
// Result:
// bar
// see
// Asynchronous - I know async keyword returns a promise so i am resolving it
async function foo() {
    const result1 = await bar();
    console.log(result1);

    const result2 = await see();
    console.log(result2);
}
async function bar() {
    return 'bar';
}
async function see() {
    return 'see'
}
foo();
// Result:
// bar
// see

我看到这两种场景的执行方式相似,我是否遗漏了任何东西,或者异步函数是否在事件循环中排队?

【问题讨论】:

  • 只需执行foo(); console.log("foo returned"); 即可查看差异。
  • 你有什么理由相信以上任何一种,结果应该不同?有点不清楚你对什么感到困惑..
  • @Bergi 我现在看到了不同之处。谢谢
  • node.js 是一个事件驱动的架构。这种事件驱动的架构决定了异步操作的处理方式。

标签: javascript node.js asynchronous es6-promise event-loop


【解决方案1】:

异步函数在事件循环中排队,但您只能在异步函数中使用 await。顶级异步函数同步运行。

可以认为异步函数的主体被零个或多个等待表达式分割。顶级代码,直到并包括第一个等待表达式(如果有),都是同步运行的。这样,没有 await 表达式的异步函数将同步运行。但是,如果函数体内有 await 表达式,则 async 函数将始终异步完成。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#description

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 2011-07-04
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多