【问题标题】:Order of execution in promises in javascriptjavascript中promise的执行顺序
【发布时间】:2019-03-21 20:32:02
【问题描述】:

我有一个示例程序来了解 promises 和 async/ await 的工作原理。但是我对承诺的执行顺序有点困惑。任何人都可以解释这是如何工作的吗?

案例1

//Promise 1
let promiseTest = new Promise((resolve, reject) => {
  var k = 0;
  for(i=0; i< 1000; i++ ){
    k += i;
  }
  resolve(k);
  console.log("Inside promise1")
});

promiseTest.then((res)=> {
    console.log('Promise1 result : '+ res);
}).then(() => {
    promiseTest2.then((res) => {
        console.log(res)
    });
}).then(finish)
.catch((err) => {
 console.log(err)
});

//Promise 2
let promiseTest2 = new Promise ((resolve, reject) => {
    console.log("Inside promise2")
});

function finish(){
    console.log("finished promise");
}

为此,我得到的结果为

结果

Inside promise1
Inside promise2
Promise1 result : 499500
finished promise

案例2

我有另一个例子对 async/await 做同样的事情。但是按这个执行顺序是正确的。

//Async await test
async function AsyncTest(){
    console.log("Inside async1")
    var k = 0;
    for(i=0; i< 1000; i++ ){
      k += i;
    }
  console.log('async1 result : '+ k);
  const result =  await AsyncTest2();
  console.log(result)
  console.log("finished async");
}

async function AsyncTest2(){
   return "Inside async2";
}

AsyncTest();

结果

Inside async1
async1 result : 499500
Inside async2
finished async

谢谢。

【问题讨论】:

  • 你没有从回调中返回第二个promise,所以它不是同一个链的一部分。
  • @jonrsharpe 你能纠正我做错的部分吗?
  • return promiseTest2.then(...)
  • 好的,很酷,我更正了它。它以正确的顺序工作。那么这两种情况有什么不同呢?

标签: javascript node.js promise async-await


【解决方案1】:

如果您在 Promise 上调用 .then(cb),则会创建一个新的 Promise 并由它返回,这将解析为回调 返回 的任何内容。如果那是一个 Promise 本身,则该 Promise 将在链继续之前等待。在你的情况下,你做了:

promiseTest.then((res)=> {
 console.log('Promise1 result : '+ res);
 return undefined; // implicit return
}).then(() => {
 /* doesnt matter what you do here */
 return undefined;
}).then(finish)

您是否将另一个.then 附加到另一个承诺与这个承诺链无关。

【讨论】:

  • 那么这两种方法有什么区别呢?两者是否以相同的格式工作?
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 2016-08-20
  • 1970-01-01
  • 2016-08-07
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多