为什么第二个JS异步函数调用等待1st完成?

时间:2018-02-25 23:18:01

标签: javascript async-await

我的印象是,除非使用await关键字,否则对异步函数的调用不会阻塞。但是对于以下代码:

编辑:我正在编辑这个例子,以便更好地说明我的问题。

function sum1Through(n) {
    console.log('Starting computation for ' + n);
    let result = 0;
    for (let i = 1; i <= n; i++) {
      result += i;
    }
    console.log('Finished computation for ' + n);
    return result;
}

function asyncSum1Through(n) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(sum1Through(n));
        }, 0);
    });
}

asyncSum1Through(1000000000);
asyncSum1Through(2);
sum1Through(3);

输出顺序为:

Starting computation for 3
Finished computation for 3
Starting computation for 1000000000
Finished computation for 1000000000
Starting computation for 2
Finished computation for 2

为什么第二个电话会在第一个电话完成但第三个电话不响应时被阻止?

2 个答案:

答案 0 :(得分:0)

使用异步功能并不意味着它将“异步”执行。它提供的是使用等待它可以暂停并等待某事。

Async Function

  

异步函数可以包含一个等待表达式,它会暂停   执行异步函数并等待传递的Promise   解析,然后恢复异步函数的执行和   返回已解析的值。

答案 1 :(得分:0)

函数中的所有代码都是同步的,并在调用返回promise之前立即运行。在await稍后运行之后,您需要实际await某些内容才能获得代码。

异步函数不是启动线程或并行运行任何东西,也不能阻止它们的调用者。它们只是提供了一种简单的语法来编写带有promise的顺序代码。