Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步方法总是返回未定义的_Javascript_Node.js_Asynchronous_Puppeteer - Fatal编程技术网

Javascript 异步方法总是返回未定义的

Javascript 异步方法总是返回未定义的,javascript,node.js,asynchronous,puppeteer,Javascript,Node.js,Asynchronous,Puppeteer,我不能解决这个问题,所以我在这里问: 这是异步函数,正如您所看到的,它返回一个数组。但它返回一个未定义的值 async function scrape(pageURL) { var dealArray = []; try { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.goto(pageURL);

我不能解决这个问题,所以我在这里问:

这是异步函数,正如您所看到的,它返回一个数组。但它返回一个未定义的值

async function scrape(pageURL) {
var dealArray = [];
try {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto(pageURL);
    await page.waitForSelector('div.s-item-container');
    const dealsElements = await page.$$('div.s-item-container');
    for(deal of dealsElements) {
        let dealTitleElement = await deal.$('div.s-item-container a.s-access-detail-page');
        let dealTitleValue = await (await dealTitleElement.getProperty('title')).jsonValue();
        let dealPriceElement= await deal.$('div.s-item-container span.a-color-price');
        let dealPriceValue = await (await dealPriceElement.getProperty('textContent')).jsonValue();
        let dealReviewsElement = await deal.$('div.s-item-container .a-icon-star');
        let dealLinkValue = await (await dealTitleElement.getProperty('href')).jsonValue() + '&tag=dragonstv-21';
        let dealReviewsClass = await (await dealReviewsElement.getProperty('className')).jsonValue();
        let dealReviewsValue;
        if(dealReviewsClass) {
            let starValue = dealReviewsClass.substring(26);
                if(starValue.indexOf('-') === -1) {
                    dealReviewsValue = starValue;
                } else {
                    let stars = starValue.replace('-', '.');
                    dealReviewsValue = stars;
                }
        }
        dealArray.push({
            "title": dealTitleValue,
            "price": dealPriceValue,
            "reviews": dealReviewsValue + "/5.0",
            "link": dealLinkValue,
            "store": "Amazon",
        });
    }
    return Promise.resolve(dealArray);
} catch(e) {
    console.error('Error: ' + e);
}
}
我这样称呼它:

scrape('working link').then((data) => {
    console.log(data) // result: undefined
}

只有在我从函数中声明变量并且函数不返回任何内容而只更改数组内容时,它才有效。

如前所述,函数必须返回空数组或其他数组。如果返回undefined,那么您正在生成一个异常,应该通过catch语句在控制台中看到一个异常。如果您没有看到它,您可以尝试删除try/catch,看看会出现什么异常。

我实际上已经解决了问题。它返回了一个字符串,所以我不得不使用JSON.parserequest,这样我就有了一个可以处理的对象。

似乎上一次迭代给出了一个空值。请注意,由于函数是用async关键字声明的,所以不需要显式返回带有return promise.resolvedealArray的promise。您只需返回dealArray,由于async关键字,它将被包装在一个承诺中。