Взаимодействие ВО, Генераторов, Промисов и возвращаемого объекта.

Я пытаюсь понять, как взаимодействуют кошмар и во. Пожалуйста, найдите ниже (почти) оригинальный пример страницы кошмара.

Может ли кто-нибудь дать мне подсказку, как узнать последовательность происходящих событий, т.е.

  • почему функции генератора нужны операторы yield и return для работы кода
  • как выходы автоматически запускаются vo/кошмаром, чтобы последовательность работала разумно. Предыстория: я хотел бы знать, когда и где размещать yields, однако операторы yield здесь, похоже, не делают ничего другого, кроме как фактически вызывают ожидание. С моими текущими знаниями я могу просто скопировать пример и "ждать" при вызове ".goto()" и ".end()".

К сожалению, кошмарная документация не говорит, как работает его дизайн (взаимодействие с промисами и генераторами).

Если кто-нибудь может придумать пример того, как вручную разрешить обещание run() и запустить все .next(), которые необходимы для того, чтобы функция генератора работала должным образом, это уже было бы большой помощью.

var Nightmare = require('nightmare');
var vo = require('vo');

vo( run() )(function(err, result) {
    if (err) throw err;
    console.log("end result length: ", result.length);
 });

function *run() {
    var x = Date.now();
    var nightmare = Nightmare();
    var html = yield nightmare
      .goto('http://google.com')
      .evaluate(function() {
        return document.getElementsByTagName('html')[0].innerHTML;
      });

   console.log("done in " + (Date.now()-x) + "ms");
   console.log("result:", html.length);

   yield nightmare.end();
   return html;
}

Спасибо !


person Martin Nigsch    schedule 18.01.2016    source источник
comment
Один комментарий: этот фрагмент кода делает свое дело var nm = new run(); var result1Promise = nm.next().value.then(function(result1) { var result2Promise = nm.next(result1).value.then(function(result2) { nm.next(result2); }); });. Однако мне непонятно, почему результаты урожайности должны передаваться обратно в генераторы вручную.   -  person Martin Nigsch    schedule 19.01.2016


Ответы (1)


Вам нужно передать метод по имени, а не вызывать его. Vo вызовет метод при запуске. Код должен читать

vo( run )(function(err, result) {
  if (err) throw err;
  console.log("end result length: ", result.length);
});
person Stephen    schedule 19.01.2016