如何在函数返回之前等待承诺完成

新手上路,请多包涵

基本承诺问题:

 console.log('Promise START');

function makeFullJSON(time) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, time, [time]);
  })
}

var p1 = makeFullJSON(1000);
var p2 = makeFullJSON(500);
var p3 = makeFullJSON(750);

p1.then(array => {
  console.log('Promise 1 complete', array);
});

p2.then(array => {
  console.log('Promise 2 complete', array);
});

p3.then(array => {
  console.log('Promise 3 complete', array);
});

Promise.all([p1, p2, p3]).then(arrayOfAllResolvedValues => {
  console.log('Array of resolved values:', arrayOfAllResolvedValues);
});

console.log('Promise END');

代码输出为:

 Promise START
Promise END
Promise 2 complete [ 500 ]
Promise 3 complete [ 750 ]
Promise 1 complete [ 1000 ]
Array of resolved values: [ [ 1000 ], [ 500 ], [ 750 ] ]

您如何重写代码,使输出为:

 Promise START
Promise 2 complete [ 500 ]
Promise 3 complete [ 750 ]
Promise 1 complete [ 1000 ]
Array of resolved values: [ [ 1000 ], [ 500 ], [ 750 ] ]
Promise END

原文由 S. Vaghar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 280
1 个回答

完成后你想要发生的任何事情都会进入你传递给 then 的箭头函数。

     console.log('Promise START')

    function makeFullJSON(time) {
       return new Promise((resolve, reject) => {
       setTimeout(resolve, time, [time])
    })}

    var p1 = makeFullJSON(1000)
    var p2 = makeFullJSON(500)
    var p3 = makeFullJSON(750)

    p1.then(array => {
        console.log('Promise 1 complete', array)})

    p2.then(array => {
        console.log('Promise 2 complete', array)})

    p3.then(array => {
        console.log('Promise 3 complete', array)})

    Promise.all([p1, p2, p3]).then(arrayOfAllResolvedValues => {
        console.log('Array of resolved values:', arrayOfAllResolvedValues)

        console.log('Promise END')
    })

为了放弃立即执行程序,并开始编写只有在所有 3 个承诺都解决后才会发生的代码,因为这听起来像是你想要发生的,那么我建议直接在你的代码下面创建一个新函数,以包含你会喜欢在解决后发生,并传递该函数,如: Promise.all([p1, p2, p3]).then(newFunctionName) 。以这种方式想象它可能更容易,至少在你习惯于思考它是如何精确工作之前是这样。

原文由 Kent Weigel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题