Promise 的顺序执行
Sequential execution of Promise
我实现了以下承诺功能,例如
return new Promise(function(resolve, reject) { //logic });
- cart.getBasket(要求)
- cart.updateBasket(要求)
- cart.updateDefaultShipment(要求)
- cart.getBasket对象(篮子)
目前我使用
执行代码
app.post('/Billing', function(req, res) {
cart.getBasket(req).then(function(basket) {
cart.updateBasket(req).then(function() {
cart.updateDefaultShipment(req).then(function(basket) {
cart.getBasketObject(basket).then(function(basketObj) {
res.render('billing', {
basket: basketObj
});
});
});
});
}).catch(function(error) {
console.log(error);
});
});
我读到 Promise.each
并考虑使用它,因为我的逻辑流程必须是顺序的,但是当我使用 Promise.each
时它没有按预期工作,因为我看到 inner function of each
returns 每次承诺执行的价值。
app.post('/Billing', function(req, res) {
var asyncCalls = [cart.getBasket(req), cart.updateBasket(req), cart.updateDefaultShipment(req), cart.getBasketObject(basket)];
Promise.each(asyncCalls, function(basketObj){
res.render('billing', {
basket: basketObj
});
});
});
那么,是否有任何更清洁的方法可以实现使用 .then
链所做的事情,即拥有更清洁的链。
此外,在顺序承诺执行中,下一个承诺函数是否有可能获得前一个已执行承诺的 return 值。
PS : Promise 数组长度会事先知道。
您可以对承诺进行排序,而无需像这样不断增加嵌套:
app.post('/Billing', function(req, res) {
cart.getBasket(req).then(function(basket) {
return cart.updateBasket(req);
}).then(function() {
return cart.updateDefaultShipment(req);
}).then(function(basket) {
return cart.getBasketObject(basket);
}).then(function(basketObj) {
res.render('billing', {basket: basketObj});
}).catch(function(error) {
console.log(error);
res.sendStatus(500);
});
});
从 .then()
返回承诺会自动将其链接到父承诺,这允许您在父承诺上使用 .then()
处理程序,而不是使用更深的嵌套来继续序列。
这会自动将先前承诺的结果沿链传递到下一个操作,但不会将所有先前结果传递给后续承诺。如果您需要其他先前的结果,可以在此处查看各种方法:
我实现了以下承诺功能,例如
return new Promise(function(resolve, reject) { //logic });
- cart.getBasket(要求)
- cart.updateBasket(要求)
- cart.updateDefaultShipment(要求)
- cart.getBasket对象(篮子)
目前我使用
执行代码 app.post('/Billing', function(req, res) {
cart.getBasket(req).then(function(basket) {
cart.updateBasket(req).then(function() {
cart.updateDefaultShipment(req).then(function(basket) {
cart.getBasketObject(basket).then(function(basketObj) {
res.render('billing', {
basket: basketObj
});
});
});
});
}).catch(function(error) {
console.log(error);
});
});
我读到 Promise.each
并考虑使用它,因为我的逻辑流程必须是顺序的,但是当我使用 Promise.each
时它没有按预期工作,因为我看到 inner function of each
returns 每次承诺执行的价值。
app.post('/Billing', function(req, res) {
var asyncCalls = [cart.getBasket(req), cart.updateBasket(req), cart.updateDefaultShipment(req), cart.getBasketObject(basket)];
Promise.each(asyncCalls, function(basketObj){
res.render('billing', {
basket: basketObj
});
});
});
那么,是否有任何更清洁的方法可以实现使用 .then
链所做的事情,即拥有更清洁的链。
此外,在顺序承诺执行中,下一个承诺函数是否有可能获得前一个已执行承诺的 return 值。
PS : Promise 数组长度会事先知道。
您可以对承诺进行排序,而无需像这样不断增加嵌套:
app.post('/Billing', function(req, res) {
cart.getBasket(req).then(function(basket) {
return cart.updateBasket(req);
}).then(function() {
return cart.updateDefaultShipment(req);
}).then(function(basket) {
return cart.getBasketObject(basket);
}).then(function(basketObj) {
res.render('billing', {basket: basketObj});
}).catch(function(error) {
console.log(error);
res.sendStatus(500);
});
});
从 .then()
返回承诺会自动将其链接到父承诺,这允许您在父承诺上使用 .then()
处理程序,而不是使用更深的嵌套来继续序列。
这会自动将先前承诺的结果沿链传递到下一个操作,但不会将所有先前结果传递给后续承诺。如果您需要其他先前的结果,可以在此处查看各种方法: