【问题标题】:Promise.all doesn't wait for new Promise to resolvePromise.all 不会等待新的 Promise 解决
【发布时间】:2018-12-21 01:12:47
【问题描述】:

这是使用 nodejs 和 jquery 的 spa 的一部分。 getToday 函数控制台记录“结果:”所以整个事情应该控制台记录 1,然后是结果:,然后是 2,但它不等待 getToday 完成。输出为 1, 2, 结果。

app.get('/incidents/all', function(req, res){
    let data = globals.dataTopdesk;
    let output = {}
    Promise.all([
        data.length,
        calculateProcessingStatus(data),
        calculateOnHold(data),
        calculateOpen(data),
        calculateStatus(data),
        calculateCallType(data);
    ])
    .then(function(values) {
        output.all = values[0]
        output.processingStatus = values[1],
        output.onHold = values[2],
        output.open = values[3],
        output.status = values[4],
        output.callType = values[5]
        return output;
    })
    .then(function(output) {
        console.log('1')
        return new Promise(resolve=> {
            output.today = getToday(db, output)
            resolve(output);
        })
    })
    .then(function(output) {
        console.log('2')
        res.send(output)
    })
    .catch (function(err) {
        res.send('failed: ' + err)
    })
})

为什么不等待新的 Promise 解决?

【问题讨论】:

  • getToday 是一个承诺吗?
  • 你的意思是then()里面的新承诺?为什么会呢? Promise.all 对此一无所知。这不是你给的承诺
  • getToday() 中的代码本身就是问题所在。
  • output.today = getToday(db, output) 不会等待 getToday() 所做的任何异步操作。
  • getToday 是一个异步函数,它等待另一个带有承诺的函数并返回一个对象。 Taplar 可能已经有了答案。

标签: javascript node.js promise single-page-application


【解决方案1】:

如果getToday 是异步的并返回一个promise,将它添加到链中而不用额外的promise 包装,看起来没用:

  return getToday().then(data => {
    output.today = data;
    return output;
  });

【讨论】:

  • 做到了。非常感谢。我会在 4 分钟后将其标记为答案。
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2017-09-10
  • 1970-01-01
  • 2018-02-06
  • 2021-05-19
相关资源
最近更新 更多