异步等待内部如何工作?

Man*_*Man 3 javascript asynchronous v8 node.js

我的问题是如何在 node.js 或 v8 环境中执行等待函数结果。

我们知道,node.js 是单线程非阻塞 I/O 环境。

什么是内部代码及其工作原理?

异步函数示例:

async function asyncCall() {      
 // `getCreditorId` and `getCreditorAmount` return promise
  var creditorId= await getCreditorId(); 
  var creditAmount=await getCreditorAmount(creditorId);

}
Run Code Online (Sandbox Code Playgroud)

如果执行此函数,则首先等待 CreditorId,然后使用 CreditorId 调用 getCreditorAmount,并再次仅在此异步函数中等待 Creditor Amount。

而不是异步函数,其他执行不等待,效果很好。

  1. 第二个问题

如果在这个例子中使用 Promise

getCreditorId().then((creditorId)=>{
   getCreditorAmount(creditorId).then((result)=>{
      // here you got the result
  })
});
Run Code Online (Sandbox Code Playgroud)

我的假设是,如果 async wait 在内部使用 Promise,那么 async 必须知道 getCreditorAmount 函数中使用哪个变量作为参数。

它怎么知道的?

也许我的问题毫无价值?如果它有答案那么我想知道答案。

感谢帮助。

NAV*_*VIN 5

async-await 使用 Generator 来解析并等待 Promise。

await在 async-await 中是异步的,当编译器到达 wait 时,它会停止执行并将所有内容推送到事件队列中,并在 async 函数之后继续执行同步代码。例子

function first() {
    return new Promise( resolve => {
        console.log(2);
        resolve(3);
        console.log(4);
    });
}

async function f(){
    console.log(1);
    let r = await first();
    console.log(r);
}

console.log('a');
f();
console.log('b');
Run Code Online (Sandbox Code Playgroud)

由于等待是异步的,因此等待之前的所有其他事情都会照常发生

a
1
2
4
b
// asynchronous happens
3
Run Code Online (Sandbox Code Playgroud)