zbudowałem prosty skrypt węzła przy użyciu nightmare.js zeskrobać internetoweStosować Nightmare.js bez składni ES6 i dają
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();
}
chcę uruchomić to w środowisku, za pomocą starszej wersji węzła, który nie robi obsługa funkcji ES6. Na stronie github nie ma przykładów, jak to zrobić bez słowa kluczowego "yield".
znalazłem przykład użycia bez składni ES6 tutaj: Webscraping with nightmare
Napisałem to tak:
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!');
});
To nie psuje, ale funkcja rejestrowania wynik nigdy nie jest wywoływana.
Przy użyciu składni plonów, uzyskanie zwróconej wartości z "oceny" jest całkiem proste:, ale bez niego nie znalazłem żadnego sposobu, aby to zrobić.
UPDATE Napisałem to dzięki zaakceptowanej odpowiedzi i jej uwagom. Wykorzystuje „Q” i pracuje w poprzednich wersjach węzłów do 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
});
Używając [Babel węzeł] (https://babeljs.io/docs/usage/cli/# babel-node) może być prostszym rozwiązaniem, w zależności od twojego przypadku użycia. Jest to w zasadzie opakowanie, które przenosi kod ES6 do ES5 przed uruchomieniem go. –