【问题标题】:Q Promises - Create a dynamic promise chain then trigger itQ Promises - 创建一个动态的 Promise 链然后触发它
【发布时间】:2014-07-08 17:56:22
【问题描述】:

我想知道是否有一种方法可以创建一个我可以基于一系列 if 语句构建的承诺链,并在最后以某种方式触发它。例如:

// Get response from some call
callback = (response) {
    var chain = Q(response.userData)

    if (!response.connected) {
        chain = chain.then(connectUser)
    }

    if (!response.exists) {
        chain = chain.then(addUser)
    }

    // etc...

    // Finally somehow trigger the chain
    chain.trigger().then(successCallback, failCallback)
}

【问题讨论】:

    标签: promise q


    【解决方案1】:

    promise 代表一个已经开始的操作。您不能 trigger() 承诺链,因为承诺链已经在运行。

    虽然您可以通过创建 deferred 然后围绕它排队并最终在稍后解决它来解决这个问题 - 这不是最佳选择。如果您从最后一行删除.trigger,我怀疑您的任务会按预期工作 - 唯一的区别是它会将操作排队并启动它们而不是等待:

    var q = Q();
    if(false){
        q = q.then(function(el){ return Q.delay(1000,"Hello");
    } else {
        q = q.then(function(el){ return Q.delay(1000,"Hi");
    }
    q.then(function(res){
          console.log(res); // logs "Hi"
    });
    

    这里的重点是:

    • promise 表示已经开始的操作。
    • 您可以将 .then 处理程序附加到 Promise 中,即使它已解决,它仍将按可预测的方式执行。

    祝你好运,编码愉快

    【讨论】:

    • 是的,我试过了,我发现这是我的代码中的另一个错误,它阻止了它的工作。修复了它,它都是绿色的:)
    【解决方案2】:

    正如本杰明所说...

    ...但您可能还想考虑一些稍微不同的东西。试着把代码从里到外翻过来;无条件地构建 then 链并在 .then() 回调中执行测试。

    function foo(response) {
        return = Q().then(function() {
            return (response.connected) ? null : connectUser(response.userData);
        }).then(function() {
            return (response.exists) ? null : addUser(response.userData);//assuming addUser() accepts response.userData
        });
    }
    

    我认为你会通过返回空值而侥幸 - 如果 null 不起作用,那么试试 Q()(在两个地方)。

    如果我对传递给addUser() 的内容的假设是正确的,那么您无需担心将数据沿链传递——response 在外部函数形成的闭包中仍然可用。如果这个假设不正确,那么不用担心 - 只需安排 connectUser 返回任何必要的内容,然后在第二个 .then 中提取它。

    我认为这种方法比条件链构建更优雅,尽管它的效率较低。也就是说,您不太可能注意到差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      相关资源
      最近更新 更多