【问题标题】:Returning Data from a forEach inside a Promise [duplicate]从 Promise 中的 forEach 返回数据 [重复]
【发布时间】:2021-10-29 12:01:31
【问题描述】:

我在返回创建的对象时遇到问题,代码如下:

在 Promise.allSettled 中,我最终得到循环并将每个数组推送到一个对象的结果(这可以很好地创建对象),当我尝试返回该对象时,它是空的。

我想是因为我的承诺还没有兑现,我已经尝试过:

Promise.resolve(returnedData) 然后返回它,甚至返回 .then(results => results)。

我错过了什么?我想我已经看了很长时间了,我想念的东西很清楚。

const getProductData = () => {
  debugger;
  const productIds = [];
  const returnedData = [];
  const customerLocation = getCustomerLocation();
  productdataItems.forEach((product) => {
    productIds.push(
      product
        .querySelector('[data-test-id="product-card-code"]')
        .innerHTML.replace(/[^0-9]/g, ''),
    );
  });

  const items = productIds.map((product) => ({
    productCode: product,
    quantity: 1,
  }));

  // Load in products for other steps
  const promises = [];
  productIds.forEach((sku) => {
    promises.push(getProduct(sku));
  });

  Promise.allSettled(promises).then((results) => {
    // Stock requires location data.
    if (customerLocation) {
      getEligibility(items, customerLocation).then((eligibility) => {
        getStock([customerLocation.collectionBranchId], productIds).then(
          (stock) => {
            results.forEach((result, i) => {
              if (result.value.product) {
                returnedData.push({
                  Product: result.value.product,
                  Eligibility: eligibility[i],
                  Stock: stock[i].quantity,
                  ProductMarkup: productdataItems,
                  PostCode: customerLocation.deliveryPostcode,
                });
              }
            });
          },
        );
      });
    }
  });

  return returnedData;
};

【问题讨论】:

  • 你在 allSettled 完成之前返回,所以它总是空的。您需要等待 Promise.allSettled 才能使其正常工作。
  • 就像@pilchard 试图解释的那样,问题是作为参数传递给then 的函数不会立即执行,而是安排在以后执行(不是在所有承诺都很好、解决之前,这可能需要一段时间,视情况而定),它们实际上是回调。因此,您对Promises.allSettled 调用返回的承诺的then 调用立即返回,并注册了一个将填充returnedData 的回调函数,其关键区别在于,当then 返回时,returnedData 仍然为空大批。这就是你所缺少的。
  • 您需要花一些时间了解 JavaScript 事件循环和承诺,特别是。这可能需要你一天的时间,但这是值得的,否则恐怕你会经常遇到这类问题。

标签: javascript function asynchronous es6-promise


【解决方案1】:

returnedData 在 promise.allSettled 之外。所以它在 Promise.allSettled 完成之前被返回,因此它是空的。

你应该做的是在 Promises 中移动 returnData 的返回

return Promise.allSettled(promises).then((results) => {
... ... 
return returnData;
}

getProductData 需要是一个返回 promise 结果的异步方法。

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 2018-04-07
    • 1970-01-01
    • 2020-05-18
    • 2021-03-17
    • 1970-01-01
    • 2017-11-16
    • 2019-01-23
    • 2021-04-21
    相关资源
    最近更新 更多