如何解决减少方法和承诺
我在使用 _.reduce
和 promise 时遇到问题。
我需要使用 Promise 来获取我的项目,并且我想使用 _.reduce
用另一个 Promise 修改结果的内容。
我的代码:
StripeJs.getBalanceTransactions = function(locals,gte,lte) {
return stripe.balanceTransactions.list().then(function(balanceTransactions) {
let payoutsBalanceTransactions = _.filter(balanceTransactions.data,{ type: 'payout' });
payoutsBalanceTransactions = _.reduce(payoutsBalanceTransactions,function(arr,payoutBalanceTransaction) {
stripe.balanceTransactions.retrieve(payoutBalanceTransaction.id).then(function(subItems) {
payoutBalanceTransaction.subitems = subItems;
console.log(payoutBalanceTransaction); // works !
arr.push(balanceTransactions);
});
return arr;
},[]);
console.log(payoutsBalanceTransactions); // does not work,array empty
return Promise.resolve(payoutsBalanceTransactions);
});
};
解决方法
您当前代码的问题在于您在异步回调中将结果推送到数组中。因此 payoutsBalanceTransactions
数组保持为空,直到回调被触发。你console.log(payoutsBalanceTransactions)
在数组被填充之前的内容,这就是数组为空的原因。
如果您不介意使用 async
/await
最干净的解决方案可能是:
StripeJs.getBalanceTransactions = async function (locals,gte,lte) {
const transaction = await stripe.balanceTransactions.list();
const payouts = _.filter(transactions,{ type: 'payout' });
await Promise.all(payouts.map(async function (payout) {
const items = await stripe.balanceTransactions.retrieve(payout.id);
payout.subitems = items;
}));
console.log(payouts);
return payouts;
};
我重命名了一些变量,因为其中一些变量很长。如果您不能或不想使用 async
/await
,事情会变得更加棘手。
StripeJs.getBalanceTransactions = function (locals,lte) {
return stripe.balanceTransactions.list()
.then(function (transactions) {
const payouts = _.filter(transactions,{ type: 'payout' });
return Promise.all(payouts.map(function (payout) {
return stripe.balanceTransactions.retrieve(payout.id)
.then(function (items) {
payout.subitems = items;
return payout;
});
}));
})
// This last `then()` is only here for logging,you can remove it
// entirely if you don't need the `console.log()` any more.
.then(function (payouts) {
console.log(payouts);
return payouts;
});
};
为了更好地理解 Promise 和异步代码,我建议阅读Using Promises guide。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。