我有一个异步函数,它调用其中的另一个异步函数。此异步函数正在返回"
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;
}
使用映射,您将得到一个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,因此可以将其省略,如下所示: 然后像以前一样做