Задать вопрос
@babbert

PhantomJS — как открыть несколько страниц к цикле?

Здравствуйте.

Из-за того что в PhantomJS .open асинхронный, цикл не дожидается ответа и проходит дальше. Есть решения, с setTimeout, но они мне не подходят, из-за фиксированной задержки. У меня так же есть вариант с тем, чтобы запускать скрипт отправка запроса отдельно, и просто ждать его ответа, exec же не асинхронный (надеюсь).

page.open(platform.url.list.replace('{PAGE.NUM}', numPage), function(sList) {
            if(sList === "success") {
                var listResources = page.evaluate(handler.getListResources);
                for(iList in listResources) {
                    page.open(platform.url.list.replace('{RES.ID}', listResources[iList].id), function() {
                        console.log(1);
                        if(sVersions === "success") {
                            var versionsResource = page.evaluate(handler.getVersions);
                            for(iVersion in versionsResource) {
                                listResources[iList].versions = versionsResource[iVersion];
                                console.log(5)
                            }
                        }
                    });
                };
                console.log(JSON.stringify(listResources));
                numPage++;
            } else phantom.exit();
		});

В цикле
for(iList in listResources)
, всё выполняется 1 раз, последний и выводится
console.log(1);
1 раз, хотя там 20 ссылок.

Возможно ли как-то поставить цикл на паузу, до помента пока callback функция не снимер его с паузы и цикл продолжится?
  • Вопрос задан
  • 302 просмотра
Подписаться 2 Простой Комментировать
Решения вопроса 2
hzzzzl
@hzzzzl
попробуй ...

page.open(platform.url.list.replace('{PAGE.NUM}', numPage), async function(sList) {

и потом

var listResources = await page.evaluate(handler.getListResources);
...
for(iList in listResources) {
await page.open(platform.url.list.replace('{RES.ID}', listResources[iList].id), function() {

что-то изменится?
где-то наверняка можно заставить JS "подождать"
Ответ написан
@babbert Автор вопроса
Переходи на puppeteer, пока не поздно. Не встречал в нем проблем, спасибо за совет.
Не наступай на мои грабли и не тартъ время на заброшенный фантом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы