减少方法和承诺

时间:2021-06-20 09:47:23

标签: javascript promise lodash reduce

我在使用 _.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);
  });
};

1 个答案:

答案 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

相关问题