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)
我确切地知道你在问什么但是.
如果你想按顺序运行一系列promises,那就是这个答案
需要注意的重要一点是它不是一系列的承诺.这是一系列承诺的功能.这是因为promises会立即执行,因此在您需要之前无法创建承诺.
如果你不想把它们放在数组中,虽然正常情况只是正常链接它们.
再次制作一堆最简单的方法就是返回承诺.那你就是
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)
等等...
归档时间: |
|
查看次数: |
7374 次 |
最近记录: |