当前位置: 首页 > 知识库问答 >
问题:

为什么我的异步函数调用另一个异步函数返回Promise{}而不是值?[重复]

艾俊悟
2023-03-14

我有一个异步函数,它调用其中的另一个异步函数。此异步函数正在返回"

temp [
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> }
]

你能帮我解决这个问题吗?

以下是第一个异步函数:

router.get('/all', async (req, res, next) => {
  ProductTable.getAllProducts()
    .then(async ({ allProducts }) => {
        const newAllProducts = await updateAllProducts(allProducts);

        res.json({ allProducts });
    })
    .catch(error => next(error));
 });

如你所见,我调用updateAllProducts函数,并将该值存储到一个变量调用newAllProducts. updateAllProducts是另一个异步函数。

以下是updateAllProducts的代码:

const updateAllProducts = async (allProducts) => {
  const temp = await allProducts.map(async (product, index) => {
      const url = product.url;

      const { currentPrice, newSizes } = await scrapeData(url);
      const { currentAvailableSizes, unavailableSizes } = newSizes;

      const long = product.availableSizes.length >= currentAvailableSizes.length ? product.availableSizes : currentAvailableSizes;
      const short = product.availableSizes.length <= currentAvailableSizes.length ? product.availableSizes : currentAvailableSizes;
      const availableSizesDiff = long.filter(x => short.indexOf(Number(x)) === -1);

      product.currentPrice = currentPrice;
      product.priceDiff = 1000;
      product.currentAvailableSizes = currentAvailableSizes;
      product.availableSizesDiff = availableSizesDiff;
  });

  return temp;
}

此updateAllProducts函数正在调用另一个异步函数调用其中的数据。

ScrapeData函数只是一个使用木偶师库从网页上抓取数据的函数。下面是代码:

const scrapeData = async (url) => {
   const browser = await puppeteer.launch();
   const page = await browser.newPage();

   await page.goto(url);

   const currentPrice = await page.evaluate(() => {
      if(document.querySelectorAll('[data-test="product-price-reduced"]').length !== 0) {
        return document.querySelectorAll('[data-test="product-price-reduced"]')[0].textContent;
      } else {
        return document.querySelectorAll('[data-test="product-price"]')[0].textContent;
      }
   });

   const newProductInfo = { currentPrice };

   return newProductInfo;
 }

共有1个答案

弘焕
2023-03-14

使用映射,您将得到一个Promise数组,其中Promise.all()非常适合。它在所有promise完成后完成,并给你一个结果列表。如评论中已经指出的,这里将进一步解释。

在您的具体情况下,这应该可以做到:

const updateAllProducts = async (allProducts) => {
  const temp = await Promise.all(allProducts.map(async (product, index) => {
      const url = product.url;

      const { currentPrice, newSizes } = await scrapeData(url);
      const { currentAvailableSizes, unavailableSizes } = newSizes;

      const long = product.availableSizes.length >= currentAvailableSizes.length ? product.availableSizes : currentAvailableSizes;
      const short = product.availableSizes.length <= currentAvailableSizes.length ? product.availableSizes : currentAvailableSizes;
      const availableSizesDiff = long.filter(x => short.indexOf(Number(x)) === -1);

      product.currentPrice = currentPrice;
      product.priceDiff = 1000;
      product.currentAvailableSizes = currentAvailableSizes;
      product.availableSizesDiff = availableSizesDiff;
  }));

  return temp;
}

 类似资料:
  • 问题内容: 我的代码: 当我尝试运行这样的东西时: 我越来越: 但为什么? 我的主要目标是将令牌(从令牌中返回承诺)转换为变量。然后才执行一些操作。 问题答案: 只要其结果尚未解决,promise将始终记录未决。无论promise状态如何(已解决或仍处于待处理状态),您都必须调用promise来捕获结果: 这是为什么? 承诺只是向前的方向;您只能解决一次。a的解析值传递给其或方法。 根据Promi

  • 我的代码: 当我尝试运行这样的东西时: 我得到了: 但为什么? 我的主要目标是将返回承诺的中的token转换为一个变量。然后才预形成一些动作。

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 考虑以下代码: 这是我得到的输出: 但是如果我把代码改成这样: 我会得到这个: 我很困惑,因为根据文档,应该暂停执行,直到promise得到解决。在这种情况下,第一个示例应该以数组的形式返回

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做