javascript - 如何在函数返回之前等待 promise 完成

标签 javascript promise

基本 promise 问题:

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

最佳答案

完成后你想要发生的任何事情都在你传递给 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 都解决后才会发生的代码,因为听起来你想要发生,那么我建议直接在你的代码下面创建一个新函数,以包含代码您希望在解析后发生,并传递该函数,如:Promise.all([p1, p2, p3]).then(newFunctionName)。以这种方式想象它可能更容易,至少在您习惯于思考它的精确工作原理之前是这样。

关于javascript - 如何在函数返回之前等待 promise 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685257/

相关文章:

javascript - Promise.all 不等待所有 Promise 完成 firestore 数据读取

javascript - 链式 promise 不会传递拒绝

javascript - Promisejs 不准确,$getJSON 处于循环状态

javascript - 链式 promise 和保留 `this`

javascript - 为什么我无法设置批量事件处理程序?

javascript - 如何让 jQuery 在页面加载时单击按钮?

javascript - 多维javascript数组仅影响forEach中的最后一个数组

javascript - Web Audio API Analyzer节点无法按预期工作

node.js - Node Promises 如何进入 `nextTick` 和 `setImmediate` 之间?

javascript - 将鼠标悬停在 href 标签和图标上 jquery