Verwenden Sie Nightmare.js ohne ES6-Syntax und ergeben Sie

Ich habe ein einfaches Knotenskript mit nightmare.js erstellt, um Websites zu durchsuchen

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

vo(run)(function(err, result) {
    if (err) throw err;
});

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);

    yield nightmare.end();
}

Ich möchte dies in einer Umgebung mit einer älteren Version des Knotens ausführen, die keine ES6-Funktionen unterstützt. Es gibt keine Beispiele auf der Github-Seite, wie dies ohne das Schlüsselwort "yield" durchgeführt werden kann.

Ich habe hier ein Anwendungsbeispiel ohne die ES6-Syntax gefunden:Webscraping mit Alptraum

Ich schrieb es so:

var night = new Nightmare()
.goto('http://www.google.com')
.evaluate(function () {
  return document.getElementsByTagName('html')[0].innerHTML;
},function (html) {
   console.log("result", html);
  }
)
.run(function (err, nightmare) {
  if (err) return console.log(err);
  console.log('Done!');
});

Es stürzt nicht ab, aber die Funktion zur Ergebnisprotokollierung wird nie aufgerufen.

Mit der Yield-Syntaxden Rückgabewert von "evaluieren" zu bekommen ist ziemlich einfach, aber ohne es habe ich keine Möglichkeit gefunden, es zu tun.

AKTUALISIERE Schrieb dies dank der akzeptierten Antwort und ihrer Kommentare. Es verwendet 'Q' und funktioniert in Knotenversionen vor 0.12:

var Nightmare = require('nightmare');

var Promise = require('q').Promise;

var x = Date.now();
var nightmare = Nightmare();
Promise.resolve(nightmare
  .goto('http://google.com')
  .evaluate(function() {
      return document.getElementsByTagName('html')[0].innerHTML;
})).then(function(html) {
    console.log("done in " + (Date.now()-x) + "ms");
    console.log("result", html);
    return nightmare.end();
}).then(function(result) {

}, function(err) {
   console.error(err); // notice that `throw`ing in here doesn't work
});

Antworten auf die Frage(2)

Ihre Antwort auf die Frage