javascript - 处理嵌套 promise 的最佳方式( Bluebird )

标签 javascript promise bluebird

<分区>

我下面有以下 promise 链,它看起来很乱(每个 _create* 函数返回一个 promise ):

return new Promise(function (resolve, reject) {
      _this.database.transaction(function (t) {
        _this._createExternalAccount(payment, t)
          .then(function (externalAccount) {
            return _this._createExternalTransaction(externalAccount, payment, t)
              .then(function (externalTransaction) {
                return _this._createAddress(externalAccount, payment, t)
                  .then(function (address) {
                    return _this._createTransaction(address, payment, t)
                      .then(function (transaction) {
                        return _this._createGatewayTransaction(externalTransaction, transaction, payment, t)
                          .then(function (gatewayTransaction) {
                            t.commit();
                            resolve(bridgePayment);
                          });
                      });
                  });
              });
          })
          .error(function (bridgePayment) {
            t.rollback();
            reject(bridgePayment);
          });
      });

我知道有一些我可以使用的 Promise 函数,比如 all()join() 但这些似乎同时运行了我不能做的函数,因为坚持某些表需要以前保留的表中的字段。我希望有一些方法可以让我做类似下面的事情,但我似乎无法找到如何做:

Promise.all(_this._createExternalAccount(payment, t), _this._createExternalTransaction(externalAccount, payment, t), _this._createAddress(externalAccount, payment, t))
    .then(function(externalAccount, externalTransaction, address) {
        // do logic
    });

最佳答案

我完全确定你在问什么,但是。

  1. 如果您想按顺序运行一组 promise ,则有 this answer

    需要注意的重要一点是它不是一组 promise 。它是一组做出 promise 的函数。这是因为 promise 会立即执行,因此您无法在需要时创建 promise。

  2. 如果您不想将它们放入数组中,尽管正常情况下只是将它们正常链接起来。

    又是使一堆函数返回 promise 的最简单方法。那你就

    var p = firstFunctionThatReturnsAPromise()
    .then(secondFunctionThatReturnsAPromise)
    .then(thirdFunctionThatReturnsAPromise)
    .then(fourthFunctionThatReturnsAPromise)
    

    你可以很容易地嵌套它们

    function AOuterFunctionThatReturnsAPromise() {         
        var p = firstFunctionThatReturnsAPromise()
                .then(secondFunctionThatReturnsAPromise)
                .then(thirdFunctionThatReturnsAPromise)
                .then(fourthFunctionThatReturnsAPromise);
        return p;
    };
    

    现在外层函数只是另一个返回 promise 的函数,这意味着你 可以应用与内部函数相同的模式。

    当然如果那些可以内联

    var p = function() {
      return new Promise(resolve, reject) {
        DoSomethingAsync(function(err, result) {
          if (err) {
            reject();
          } else {
            resolve(result);
        };
      };
    }).then(function() {
      return new Promise(resolve, reject) {
        DoSomethingAsync(function(err, result) {
          if (err) {
            reject(err);
          } else {
            resolve(result);
        };
      };
    }).then(function() {
      var err = DoSomethingNotAsync();
      if (err) {
         return Promise.reject(err);
      } else {
         return Promise.resolve();
      }
    });
    

    等...

关于javascript - 处理嵌套 promise 的最佳方式( Bluebird ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305267/

相关文章:

javascript - 即使我将它设置为可见,模态也没有显示?

node.js - 'promise' 返回空数组

javascript - 使用 Promise.all(),其中个人 promise 出错时重试

javascript - 串行 promise 和响应。云代码中的成功

javascript - Syncano Codebox - 调用 API - 解析 JSON - 获取引用 - 保存新对象

javascript - 如何使用Promise.promisify确保正确的 "this"?

javascript - tinyMce 4 中的 onDblclick 函数用于编辑页眉和页脚

javascript - 尝试将旧的 React native 文件更新为 0.30

javascript - 如何缩放和旋转由带有 Canvas 的 html5 GetUserMedia API 流式传输的网络摄像头视频?

javascript - 如何拒绝(并正确使用)Promise?