2015-09-15 38 views
7

verim ben değil, hangi web siteleriniKullanım ES6 sözdizimi olmadan Nightmare.js ve

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

Ben düğüm eski bir sürümünü kullanarak bir ortamda bu çalıştırmak istiyorum kazımak için nightmare.js kullanarak basit bir düğüm metni oluşturdu ES6 özelliklerini destekleyin. Github sayfasında "getiri" anahtar kelimesi olmadan nasıl yapılacağına dair örnek yoktur. Webscraping with nightmare

böyle yazdım:

Burada ES6 sözdizimi olmadan kullanımına yönelik bir örnek buldunuz O çökmez

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

ama sonuç günlüğü fonksiyonu asla denir.

Verim sözdizimi ile döndürülen değeri "değerlendirmeden" almak oldukça basittir, ancak onsuz, bunu yapmanın bir yolunu bulamadım.

UPDATE Bunu kabul edilen yanıt ve yorumları sayesinde yazdı. Bu 'Q' kullanır ve 0.12 önceki düğüm sürümlerinde çalışır:

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 
}); 
+1

[babel-düğümünü] Kullanma (https://babeljs.io/docs/usage:

Hesabınızı bir then çağrısıyla her yield yerine, bir söz zincirinde içine doğrusal jeneratör kodu dönüştürebilir/cli/# babel-node) kullanım durumunuza bağlı olarak daha basit bir çözüm olabilir. Temelde ES6 kodunu ES5'e aktarmadan önce etrafındaki sarıcıdır. –

cevap

12

docs korkunç, ama Kabus thenables dayandığını görünüyor. Geri arama arayüzü hakkında da fazla bilgi bulamadım, ancak bu zaten bir girinti piramidine yol açacaktır.

En iyi bahsiniz sözünü kullanmaktır, sadece ES6 standardını takip eden any library'u seçin (hepsi de ES6 dışı ortamlarda kullanılabilir).

var Nightmare = require('nightmare'); 
var Promise = require('…'); 

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 
}); 
+0

Bu kesin örnekte listenin hangi kütüphanesini kullandınız? Başarısız "q" ile denedim – Rayjax

+0

Ah, 'Q' eski çağrı kurallarına sahiptir (en eski kütüphanelerden biriydi). "Promise" yerine "Q.Promise" ve Promise.resolve yerine "Q" yerine yapmanız gerekir. – Bergi

+0

Şimdi çalışıyor :) – Rayjax