Как мне дождаться завершения обещания в цикле, прежде чем делать что-то еще? - PullRequest
1 голос
/ 23 марта 2019

Я все еще не понял, как использовать обещания.У меня есть вызов цикла для асинхронного метода, который возвращает значение.Я использую это значение для вставки в массив.Но когда я печатаю массив, он пуст.Вот что я сделал:

async function getLink(link) {
    var browser = await puppeteer.launch({headless: true});
    const page = await browser.newPage();
    await page.goto(LINK)
    const result = await page.evaluate( async() => {
        let data = [];
        const $ = window.$;
        $('#gallery_01 .item').each(function(index, product) {
            data.push($(product).find('a').attr('data-image'));
        });
        return data;
    });
    await browser.close();
    return result;
}
var final = [];
for (var i = 0; i < 10; i++) {
        var data = getLink(value[i].url).then(function(data) {
            console.log(data); // urls show here
            final.push(data);
        });
}
Promise.all(final).then(() => {
        console.log(final) // empty
})

final Показать пусто.Что я сделал не так с Promise?Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Я не вижу, что такое value, но похоже, что это должен быть массив объектов со свойством url?

Предполагая, что с функцией getLink () все в порядке, попробуйте это для своего цикла:

const final = [];
for (var i = 0; i < 10; i++) {
  final.push(getLink(value[i].url));
}

Promise.all(final)
  .then(data => {
    console.log(data);
  });

Или немного более компактный способ сделать то же самое:

const promises = value.map(v => getLink(v.url));

Promise.all(promises)
  .then(data => {
    console.log(data);
  });

1 голос
/ 23 марта 2019

Обновление: мой плохой, немного запутался. Следующий код будет работать только без () => после var fn

Вы очень близки. Попробуйте это:

var final = [];
var results = []; // you need a separate array for results
for (var i = 0; i < 10; i++) {
       // renamed the variable, changed 'data' to 'fn' 
        var fn = () => getLink(value[i].url).then(function(data) {
            console.log(data); // urls show here
            results.push(data); 
        });
        final.push(fn);
}
Promise.all(final).then(() => {
        console.log(results) 
})

Promise.all принимает массив обещаний. У вас есть массив 'final', но вы, похоже, пытаетесь сохранить результат выполнения функции, а также саму функцию.

Чтобы сделать это правильно - сначала получите массив обещаний. Затем передайте их Promise.all ().

P.S. Предполагая, что ваша функция действительно работает, не смотрели на нее, поскольку вопрос был об обещаниях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...