Tôi có chuỗi lời hứa sau dưới đây và nó dường như là khá lộn xộn (Mỗi chức năng _create
* trả về một lời hứa):Cách tốt nhất để xử lý Promises lồng nhau (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);
});
});
Tôi biết có Promise chức năng tôi có thể sử dụng như all()
và join()
nhưng những điều này dường như chạy các hàm đồng thời mà tôi không thể làm vì sự kiên trì đối với một số bảng yêu cầu các trường từ các bảng đã tồn tại trước đó. Tôi hy vọng có một số cách để tôi làm điều gì đó như sau nhưng tôi dường như không thể tìm ra cách:
Promise.all(_this._createExternalAccount(payment, t), _this._createExternalTransaction(externalAccount, payment, t), _this._createAddress(externalAccount, payment, t))
.then(function(externalAccount, externalTransaction, address) {
// do logic
});
Bạn có thể muốn khám phá chaining:... 'P.then() sau đó() sau đó() sau đó() 'thay vì lồng nhau. – jfriend00
Kiểm tra Bluebird '.map()' bạn có thể truyền '{concurrency: N}' để nó chỉ thực hiện các hoạt động 'N' tại một thời điểm – aarosil