处理嵌套Promise的最佳方法(bluebird)

Con*_*ara 12 javascript promise bluebird

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

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);
          });
      });
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用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
    });
Run Code Online (Sandbox Code Playgroud)

gma*_*man 6

我确切地知道你在问什么但是.

  1. 如果你想按顺序运行一系列promises,那就是这个答案

    需要注意的重要一点是它不是一系列的承诺.这是一系列承诺的功能.这是因为promises会立即执行,因此在您需要之前无法创建承诺.

  2. 如果你不想把它们放在数组中,虽然正常情况只是正常链接它们.

    再次制作一堆最简单的方法就是返回承诺.那你就是

    var p = firstFunctionThatReturnsAPromise()
    .then(secondFunctionThatReturnsAPromise)
    .then(thirdFunctionThatReturnsAPromise)
    .then(fourthFunctionThatReturnsAPromise)
    
    Run Code Online (Sandbox Code Playgroud)

    您可以轻松地嵌套它们

    function AOuterFunctionThatReturnsAPromise() {         
        var p = firstFunctionThatReturnsAPromise()
                .then(secondFunctionThatReturnsAPromise)
                .then(thirdFunctionThatReturnsAPromise)
                .then(fourthFunctionThatReturnsAPromise);
        return p;
    };
    
    Run Code Online (Sandbox Code Playgroud)

    现在,外部函数只是另一个返回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();
      }
    });
    
    Run Code Online (Sandbox Code Playgroud)

    等等...