2014-10-16 3 views
2

Я использую эту фреймворк, чтобы делать скриншоты из нескольких URL-адресов. Процесс принятия скриншот является асинхронной, и этот метод не обеспечивает способ выполнения обратного вызова, и я хочу, чтобы выполнить обратный вызов, когда каждый кадр сделан по этому сценарию:NightmareJS обратный вызов скриншота

nightmare = new Nightmare(); 
urls.forEach(function (url) { 
    nightmare.goto(url).screenshot(path); 
}); 

nightmare.run(function() { 
    console.log('finished all'); 
}); 

Любые идеи, как я могу сделай это?

ответ

3

Я нашел способ сделать это, используя метод «use» для выполнения плагинов.

nightmare = new Nightmare(); 
urls.forEach(function (url) { 
    nightmare.goto(url).screenshot(path).use(function() { 
     console.log('finished one'); 
    }); 
}); 

nightmare.run(function() { 
    console.log('finished all'); 
}); 
1

Это, как представляется, является целью метода run(). Вы, вероятно, хотите, чтобы настроить и запустить каждый снимок экрана внутри цикла, так как метод screenshot() основан на методе phandomjs render() и render() is strictly synchronous (по крайней мере, из года назад):

urls.forEach(function (url) { 
    nightmare = new Nightmare(); 
    nightmare.goto(url).screenshot(path).run(function(err, nightmare) { 
     console.log('this executes when your screenshot completes'); 
     // run() appropriately tears down the nightmare instance 
    }); 
}); 

console.log('finished all'); 

Вы не получаете какой-либо асинхронные выгоды от настройки всех скриншотов за один раз, а «завершение всего» гарантированно будет работать только после того, как будут сняты все снимки экрана.

В качестве альтернативы, в nightmarejs источника, он выглядит как screenshot()делает принять второй done параметр, который появляется, чтобы быть обратным вызовом, но он передает его непосредственно в phantomjs render() метода, и, как показан в приведенной выше ссылке был некоторое сопротивление, позволяющее этому методу принимать обратный вызов.

+0

команда запуска предназначена для использования только один раз, в конце – fernandopasik

+0

Теперь, когда я посмотрел на источник, а не полагаться на примеры, кажется, что вызов работать в цикле, скорее всего, нынешние проблемы. Вы можете решить это, установив новый экземпляр Nightmare для каждого снимка экрана. Кроме того, 'screenshot()' method * делает * принимает второй параметр 'done', который выглядит как обратный вызов, хотя он передает его непосредственно в phantomjs, и я не знаю, что с ним делать. Метод «render()», который он вызывает, является синхронным, поэтому вы будете иметь большое синхронное действие в середине каждой итерации независимо. – Jason

+0

Я обновил свой ответ с материалами, которые я видел в источнике. – Jason

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

  • Нет связанных вопросов^_^