【问题标题】:Calling Q Promise on the basis of conditional logic基于条件逻辑调用 Q Promise
【发布时间】:2016-08-24 20:42:47
【问题描述】:

以下是我的情况

if abc is true
    call async func1, func2
else
    call async func1

function test(): Q.Promise<boolean> {
    if(abc)
       Q.all([func1,func2])
    else
       Q.all([func1])
    //if failed throw reject reason all the way in the chain
}
  1. 如图所示,可以使用ifelse子句来完成,有没有更好的方法来有条件地调用promise?
  2. 如何退回error from any one of the promises

【问题讨论】:

    标签: node.js promise q


    【解决方案1】:

    我会将 promise 放入数组并根据条件添加新的:

    function test(): Q.Promise<Boolean[]> {
        const promises = [func1()] 
        if (abc) promises.push(func2()) 
        return Q.all(promises)
    }
    

    我稍微更正了类型签名,因为 Q.all 使用来自每个底层承诺的 array 值(在您的情况下为布尔值)解析。您还需要致电func1func2。最后,别忘了从test 函数返回。

    【讨论】:

    • 如果promise 之一是rejected 会发生什么,我将如何将error 一直向上抛出。我正在努力学习Q.promises,如果这是个愚蠢的问题,请原谅:)
    • 你不需要明确地抛出。如果其中一个函数抛出或返回被拒绝的承诺,那么Q.all 也会为您拒绝,并且错误将自动冒泡到 Q.all 错误处理程序:test().then(function() { console.log('all fine') }).catch(function(error) { console.log('something went wrong') })
    【解决方案2】:

    其实你已经很接近了:

    function test() {
        if(abc)
           return Q.all([func1(),func2()])
        else
           return func1();
    }
    test().then(() => {
        // do whatever
    }).catch(err => console.log(err));
    

    确保您始终返回承诺,否则它们不会被链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2020-09-11
      相关资源
      最近更新 更多