1

从我读过的所有内容来看,async/await 只是 Promise 的语法糖。由此,我希望以下两个函数能够相同地工作,假设promise_1并且promise_2都是承诺:

function promises(promise_1, promise_2) {
    promise_1.then((val) => {
        console.log(val);
        promise_2.then((val2) => {
            console.log(val2);
        });
    });
}
async function asyncawait(promise_1, promise_2) {
    console.log(await promise_1);
    console.log(await promise_2);
}

但是,在测试它们时,我注意到该promises函数比 async 函数更早地解决了第二个承诺:

let func;
async function test() {
    let promise_1 = Promise.resolve("first");
    let promise_2 = Promise.resolve("second");

    func(promise_1, promise_2);

    console.log("await first");
    await promise_1;
    console.log("awaited first");

    console.log("await second");
    await promise_2
    console.log("awaited second");
}

跑步

func = promises;
test();

产生以下输出:

await first
first
second
awaited first
await second
awaited second

请注意在 await 之后如何promise_1解决。promise_1promise_2

然而,运行

func = asyncawait;
test();

产生以下(预期的)输出:

await first
first 
awaited first
await second
second
awaited second

承诺决议交错。

是什么导致分辨率顺序出现这种差异?

4

1 回答 1

0

是的,正如您正确指出的那样,“async/await 只是 promise 的语法糖。” 考虑到这一点,

function foo(flag){
  return new Promise((res, rej) => {
    setTimeout(() => {
      if(flag) res("Resolved");
      else rej("Rejected")
    },1000);
  })
}

这里的关键是异步函数总是返回一个承诺。查看异步函数的返回值

现在,让我们使用这个功能,

function useFoo(){
  return foo(true).then(val => { console.log(val); return val; })
                  .catch(err => { console.log(err); throw err; })
} 

这相当于,

async function useFoo(){
  try{
    const val = await foo(false);
    console.log(val);
    return val;
  }catch(err){
    console.log(err);
    throw err;
  }
}

解释你的行为,

(function(){
  foo(1).then((x)=> console.log(x)); 
  console.log("after foo()");
})()

使用相同的 foo 函数,因为 foo() 是一个异步函数,所以上面的代码片段首先记录after foo()了其他任何内容。对于 executor 函数的同步操作,立即执行,

这就是“async/await 只是 Promise 的语法糖”

于 2019-09-05T07:09:47.443 回答