Асинхронный метод всегда возвращает undefined

Я не могу решить эту проблему, поэтому прошу вот что:

Это асинхронная функция, которая, как видите, возвращает массив. Но он возвращает неопределенное значение.

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.info(data) // result: undefined
}

Это работает, только если я объявляю переменную вне функции, и функция ничего не возвращает, а только изменяет содержимое массива.

Обратите внимание: поскольку ваша функция объявлена ​​с ключевым словом async, вам не нужно явно возвращать обещание с помощью return Promise.resolve(dealArray). Вы можете просто return dealArray, и он будет заключен в обещание из-за ключевого слова async.

chharvey 11.01.2019 23:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
192
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как написано, ваша функция должен возвращает массив (пустой или иначе). Если он возвращает undefined, значит, вы генерируете исключение и должны увидеть его в консоли с помощью оператора catch. Если вы его не видите, вы можете попробовать удалить команду try / catch и посмотреть, какое исключение всплывает.

Похоже, что последняя итерация дает нулевое значение. Я сам решу.

Alessandro Bertozzi 03.01.2019 15:06
Ответ принят как подходящий

Я действительно понял проблему. Он возвращал строку, поэтому мне пришлось использовать JSON.parse (запрос), поэтому у меня есть объект, над которым я могу работать.

Другие вопросы по теме