Utilice Nightmare.js sin sintaxis y rendimiento ES6

Creé un script de nodo simple usando nightmare.js para raspar sitios web

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

Quiero ejecutar esto en un entorno utilizando una versión anterior del nodo, que no es compatible con las funciones de ES6. No hay ejemplos en la página de Github sobre cómo hacer esto sin la palabra clave "rendimiento".

Encontré un ejemplo de uso sin la sintaxis ES6 aquí:Webscraping con pesadilla

Lo escribí así:

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!');
});

No se bloquea, pero la función de registro de resultados nunca se llama.

Con la sintaxis de rendimiento,obtener el valor devuelto de "evaluar" es bastante sencillo, pero sin eso, no encontré ninguna forma de hacerlo.

ACTUALIZAR Escribió esto gracias a la respuesta aceptada y sus comentarios. Utiliza 'Q' y funciona en versiones de nodo anteriores a 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
});

Respuestas a la pregunta(1)

Su respuesta a la pregunta