我在使用 _.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);
});
};
答案 0 :(得分:0)
您当前代码的问题在于您在异步回调中将结果推送到数组中。因此 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, gte, 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。