[英]JS Promises - End of Chain Returning before Chain Step
我有一個包含數據庫查詢和API調用的promise鏈。 我正在嘗試運行這些進程,然后將它們存儲為我可以在我的視圖中使用的對象,但看起來我的鏈正在渲染最后一步比從stripe.customers.retrieve
部分提取的值更快,這是阻止我恢復該方法返回的對象。 例如,請參見端子輸出部分。 這可能是我對Promises的誤解,但是不應該鏈接從上到下的順序調用這些項目? 有沒有辦法阻止最后一個鏈在stripe.customers.retrieve
完成之前呈現?
承諾鏈:
var account;
var card;
var customerInfo;
var test;
models.Account.findOne({
...
}).then(function(_account){
console.log('Here is the account: ' + _account);
account = _account;
return stripe.customers.retrieveCard(account.customerId, account.cardId, {
function(err, account){
if (err){
return console.log(err);
} else {
return console.log(account);
}
}
}).then(function(_card){
console.log('Here is the card: ' + _card);
card = _card;
return stripe.customers.retrieve(account.customerId, function(err, customer){
if (err){
return console.log(err);
} else {
return console.log('Customer is returned ' + customer)
}
}).then(function(_customer){
customerInfo = _customer;
console.log('Returned value ' + _customer);
console.log('Current card' + card);
console.log('Current customer ' + customerInfo);
res.render('pages/app/settings-billing.hbs', {
...
});
});
});
}).catch(function(err){
console.log(err);
});
終端輸出:
Here is the account: [object SequelizeInstance:account]
Here is the card: [object Object]
Returned value undefined
Current card[object Object]
Current customer undefined
Customer is returned [object Object]
答案就是:您需要按照預期返回值的方式來表達您的承諾。 你做錯了是你有嵌套的承諾。 背后的想法是你調用一個承諾,當它完成時解決了價值。
models.Account.findOne({
...
})
.then(function(_account){
console.log('Here is the account: ' + _account);
account = _account;
return stripe.customers.retrieveCard(account.customerId, account.cardId, {
function(err, account){
if (err){
return console.log(err);
} else {
return console.log(account);
}
}
});
})
.then(function(_card){
console.log('Here is the card: ' + _card);
return stripe.customers.retrieve(account.customerId, function(err, customer){
if (err){
return console.log(err);
} else {
return console.log('Customer is returned ' + customer)
}
});
})
.then(function(_customer){
customerInfo = _customer;
console.log('Returned value ' + _customer);
console.log('Current card' + card);
console.log('Current customer ' + customerInfo);
res.render('pages/app/settings-billing.hbs', {
...
});
}).catch(function(err){
console.log(err);
});
在每個條帶方法上使用then()
而不是回調,因此您可以從每個方法返回一個promise。
已經修改了一點,以便將一個對象傳遞到最后,而不是使用全局變量
models.Account.findOne({
...
})
.then(function(_account) {
let data = {
account: _account
}
return stripe.customers.retrieveCard(_account.customerId, _account.cardId).then(function(card) {
data.card = card;
return data;
});
})
.then(function(data) {
console.log('Here is the card: ' + data.card);
return stripe.customers.retrieve(data.account.customerId).then(function(customer) {
data.customer = customer;
return data
});
})
.then(function(data) {
console.log(JSON.stringify(data, null, ' '));
}).catch(function(err) {
console.log(err);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.