我遇到一個問題,我只能從我的主要 Puppeteer 函式 scrapeEbay() 內部看到我的輸出陣列變數的內容。
這是因為這個函式是異步的嗎?我的意圖是讓 main 函式能夠看到輸出陣列的內容;歸還他們。但它們將顯示為空,除非在 scrapeEbay() 函式中記錄這些陣列。
下面的代碼,只是好奇這背后的原因是什么?
var outputPrices = [];
var outputItems = [];
async function scrapeEbay(inputString) {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// Open advanced search on ebay
await page.goto("https://ebay.com/sch/ebayadvsearch");
await page.type("#_nkw", inputString);
// Make Selections for conditon and sold status
await page.click("#LH_Sold");
await page.click("#LH_ItemConditionUsed");
// Get rid of international listings
await page.click("#LH_LocatedInRadio");
// submit ebay advanced search form
await page.click("#searchBTNLowerLnk");
await page.waitForSelector("span.s-item__price");
const scrapedPrices = await page.$$eval("span.s-item__price", (spans) => {
return [...spans].slice(1).map((span) => {
// https://stackoverflow.com/a/42309034
// Slice this string to get the desired pricing; instead of the daughter <span /> tag
var slicedNumber = span.innerHTML.slice(24, -7);
// remove Commas from numbers; to not mess with the parseFloat function below
var splitNumber = slicedNumber.replace(",", "");
var price = parseFloat(splitNumber);
return price;
});
});
outputItems.push(inputString);
outputPrices.push(median(scrapedPrices));
await browser.close();
console.log([outputItems], [outputPrices]);
}
async function main(inputArray) {
for (let i = 0; i < inputArray.length; i ) {
scrapeEbay(inputArray[i]);
}
console.log([outputItems], [outputPrices]);
}
main(["i7 6700k", "gtx 970"]);
uj5u.com熱心網友回復:
使固定:
將此更改scrapeEbay(inputArray[i]);
為
await scrapeEbay(inputArray[i]);
解釋:
當您的主函式被觸發時,因為scrapeEbay它是一個異步函式,計算執行緒不會完成它,然后繼續 for 回圈以在跳轉到下一行之后一次又一次地運行它。發生的事情是啟動該函式,但由于它是一個異步函式,因此只要它到達 await 關鍵字,它就會繼續計算其呼叫堆疊中的下一個內容scrapeEbay,即 for 回圈中的下一個呼叫。完成所有這些執行后,它會轉到console.log等待的行,只有在它們準備就緒后才會繼續。因此,當console.log執行scrapeEbay尚未完成時。scrapeEbay通過在等待此函式的每次呼叫完全完成之前放置 await ,然后移至下一行,即console.log.
建議:
Promise.all如果您計劃使用更大的陣列,請考慮使用。這樣,目標函式的所有呼叫都會同時運行,從而使您的代碼更快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535683.html
