我使用Express.js制作Node.js应用程序。我有一个页面,从其他网站呈现一些数据。所以我使用Cheerio.js并没有问题,但问题是我不知道如何在报废任务完成时呈现。我做了如下代码,请看。
i == urls.length
考虑一些方法,
#1 - for (var i=0; i< urls.length ; i++){
data_set += getData(urls[i]);
if( i == urls.length){
res.render(....);
}
}
// Result :
// The data has not been scrapped, so the page wouldn't display data fully.
function getData(callback){
// get html and parse, return some data.
...
// when complete, callback();
}
var someHelper = 0;
getData(function(){ someHelper ++ ;});
if (someHelper == 3){
res.render(...);
}
// If someHeper is not 3, the page would not rendered.
// And `if statement` executed before someHelper == 3 at times ==> infinite page loading (error)
#2 - 使用getData()回调
Promise
我该如何处理?我应该找到使用$
吗?...
请帮我一点。
答案 0 :(得分:2)
你应该使用promises或async.js库,直到你......
这是你如何使用promises
来做到这一点function getData(urlString) {
return new Promise(function (res, rej) {
//fetch and resolve promise with data from urlString
});
}
var data_set = '';
var promises = [];
for (var i=0; i< urls.length ; i++){
promises.push(function () {
return getData(urls[i]).then(function (data) {
data_set += data;
});
});
}
Promise.all(promises).then(function () {
res.render('some_page', { data : data_set });
});
答案 1 :(得分:0)
嵌套回调可能会对您有所帮助。您可以逐个调用getData函数,并将内容附加到每个回调函数中的data_set。
var urls = [ 'http://a.com/fruits', 'http://a.com/cars', 'http://a.com/toys' ], data_set = '';
function getData(url, cb){
// get html and parse, return some data.
...
// call cb when downloaded contents
cb(content);
}
getData(urls[0], function (content) {
data_set += content;
getData(urls[1], function (content) {
data_set += content;
getData(urls[2], function (content) {
data_set += content;
res.render('some_page', { data : data_set });
}
}
});
为了避免回调地狱,你也可以使用像“async”,“q”,“promise”这样的模块。