2016-01-31 3 views
3

Я использую модуль асинхронного программирования для повторения нескольких URL-адресов с помощью кошмаров. Я не могу создать новый экземпляр кошмара, потому что мне придется повторно проверять подлинность каждый раз.Асинхронный вызов при циклировании URL-адресов в nightmare.js

Так что я пытаюсь использовать асинхронный модуль. Я получаю (я думаю, классическую) проблему url для всех итераций, являющихся окончательным url в массиве - не каждый отдельный url. Я думал, что с помощью модуля асинхронной бы это исправить (я также попытался с помощью пусть), но я все еще получаю проблему

'use strict' 

var Nightmare = require("nightmare"); 
var async = require("async"); 

//Creates the authenticated nightmare instance 

var scraper = new Nightmare() 
    .goto('https://www.example.com/signin') 
    .type('#login', 'username') 
    .type('#password', 'password') 
    .click('#btn') 
    .run(function(err, nightmare) { 
    if (err) { 
     console.log(err); 
    } 
    console.log('Done.'); 
    }); 

//Trying to use async module to iterate through urls 

function load(url, callback){ 
    scraper 
    .goto(url) 
    .wait(2000) 
    .screenshot('pic'+url[25]+'.png') 
    .run(function(err, nightmare) { 
    if (err) { 
     console.log(err); 
    } 
    console.log('Done with ', url[25]); 
    callback() 
    }); 
} 

var urls = [ 
    'https://www.example.com/p1', 
    'https://www.example.com/p2', 
    'https://www.example.com/p3', 
] 

async.each(urls, load, function (err) { 
    console.log('done!'); 
}); 

Спасибо за любые советы

ответ

3

Проблема заключается в этой строке:

async.each(urls, load, function (err) { 

По умолчанию async запускает each параллельно (see the documentation here, если вам интересно). Кошмар не способен выполнять несколько запросов параллельно, и, таким образом, это приведет к ошибочным результатам, как то, что вы видите.

Решение прост: переключитесь на использование async.eachSeries. Это гарантирует, что ваши запросы будут запускаться в серии, позволяя Nightmare работать так, как было разработано.

+0

Спасибо, что имеет большой смысл! – michaelbamberger

Смежные вопросы