【问题标题】:Resolve promise based on another promise根据另一个承诺解决承诺
【发布时间】:2015-01-14 10:05:19
【问题描述】:

我有一个函数,它返回一个 Promise,在里面我调用另一个函数,这个 Promise 的状态基于内部 Promise 的状态。

有没有办法简写这个过程。看下面的例子。

    function foo(bar) {
        var deferred = Q.defer();

        switch (bar) {
            case 'baz1':
                deferred.resolve();
                break;
            case 'baz2':
                deferred.reject();
                break;
            case 'this_is_how_i_do_it':
                funReturningPromise().then(function (value) {
                    deferred.resolve(value);
                }, function (err) {
                    deferred.reject(err);
                });
                break;
            case 'can_we_do_it_like_this':
                // can we do something like this, which will resolve or reject the deferred, 
                // based on the status promise returned by funReturningPromise().
                // 'chain' is just a name
                funReturningPromise().chain(deferred);
                break;
        }

        return deferred;
    }

谢谢,

【问题讨论】:

    标签: javascript node.js q


    【解决方案1】:

    它不适用于更复杂的功能,但在您的示例中,您可以执行以下操作:

            case 'can_we_do_it_like_this':
                return funReturningPromise();
    

    如果您只使用 q 个 Promise,您也可以尝试添加自己的 promise.prototype.chain 方法。

    【讨论】:

      【解决方案2】:

      如果你从 Q 管理的任何函数中返回一个值、抛出异常或返回一个 Promise,尤其是给 then 的回调,则链接的 Promise 将“变成”那个值、异常或 Promise。

      var foo = Q.fbind(function (bar) {
          switch (bar) {
              case 'baz1':
                  return;
              case 'baz2':
                  throw new Error("");
              case 'this_is_how_you_can_do_it':
                  return funReturningPromise();
          }
      });
      

      在这种情况下,我使用Q.fbind 来保证返回结果是一个promise,但是如果foo 在promise 处理程序的上下文中被调用,就像funReturningPromise 一样,fbind 会是不必要的。如果你想立即调用一个函数并得到一个promise的结果,你也可以使用fcall

      【讨论】:

        【解决方案3】:

        如果你已经有了 deferred,那么你可以用另一个 Promise 来解决它。

        deferred.resolve(funReturningPromise())
        

        否则,克里斯说的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-29
          • 1970-01-01
          相关资源
          最近更新 更多