У меня есть следующее обещание цепь ниже, и это, кажется, довольно грязные (каждый _create
* Функция возвращает обещание):Лучшего способ справиться с вложенным Promises (Bluebird)
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 I могут использовать как 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
});
Вы можете исследовать цепочки...(), а не вложенности. – jfriend00
Check Bluebird '.map()' вы можете передать '{concurrency: N}', поэтому он выполняет только операции «N» за один раз – aarosil