【发布时间】:2014-12-05 23:14:30
【问题描述】:
我在下面有以下承诺链,它看起来很混乱(每个_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);
});
});
我知道我可以使用 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
});
【问题讨论】:
-
您可能想探索链接:
p.then().then().then().then()而不是嵌套。 -
检查 Bluebird
.map()你可以通过{concurrency: N}所以它一次只执行N操作
标签: javascript promise bluebird