2015-09-15 6 views
7

उपज मैं वेबसाइटोंउपयोग Nightmare.js और

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

मैं नोड के एक पुराने संस्करण का उपयोग कर एक वातावरण में इस चलाना चाहते हैं स्क्रैप करने का है, जो ऐसा नहीं करता nightmare.js का उपयोग कर एक साधारण नोड स्क्रिप्ट बनाया ES6 सुविधाओं का समर्थन करें। "उपज" कीवर्ड के बिना इसे कैसे करें, इस बारे में जिथब पेज पर कोई उदाहरण नहीं हैं। Webscraping with nightmare

मैं इस तरह यह लिखा है::

मैं ES6 वाक्य रचना यहाँ बिना उपयोग का एक उदाहरण मिला

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

यह दुर्घटना नहीं है, लेकिन परिणाम लॉगिंग समारोह कभी नहीं कहा जाता है।

उपज वाक्यविन्यास के साथ, "मूल्यांकन" से लौटाया गया मूल्य बहुत सरल है, लेकिन इसके बिना, मुझे ऐसा करने का कोई तरीका नहीं मिला।

अद्यतन स्वीकार्य उत्तर और इसकी टिप्पणियों के लिए धन्यवाद। यह 'क्यू' का उपयोग करता है और नोड संस्करण 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 
}); 
+1

[कोलाहल नोड] का उपयोग करना (https://babeljs.io/docs/usage/क्ली/# बेबेल-नोड) आपके उपयोग के मामले के आधार पर एक आसान समाधान हो सकता है। यह मूल रूप से एक रैपर है जो ईएस 6 कोड को चलाने से पहले ईएस 5 कोड को पारदर्शी करता है। –

उत्तर

12

डॉक्स भयानक हैं, लेकिन यह है कि दुःस्वप्न thenables पर आधारित है लगता है। मुझे कॉलबैक इंटरफ़ेस पर अधिक जानकारी नहीं मिली, लेकिन इससे किसी भी इंडेंटेशन पिरामिड का कारण बन जाएगा।

तो आपकी सबसे अच्छी शर्त वादे का उपयोग करना है, बस any library चुनें जो लगभग ES6 मानक का पालन करता है (वे सभी गैर-ईएस 6 वातावरण में भी उपयोग योग्य हैं)।

आप आसानी से एक वादा श्रृंखला में अपने रैखिक जनरेटर कोड बदल सकता है, बस एक then कॉल द्वारा हर yield बदल देते हैं:

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

इस सटीक उदाहरण में आपने किस सूची का उपयोग किया था? मैंने सफलता के बिना "क्यू" के साथ प्रयास किया – Rayjax

+0

आह, 'क्यू' में विरासत कॉलिंग सम्मेलन हैं (यह सबसे पुरानी पुस्तकालयों में से एक था)। आपको 'Promise.resolve' के बजाय' वादा 'और 'Q' के बजाय' Q.Promise 'करना होगा। – Bergi

+0

यह अब काम करता है :) – Rayjax

संबंधित मुद्दे