任务完成后,Node.js res.render

时间:2016-04-14 04:00:33

标签: javascript node.js express

我使用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

我该如何处理?我应该找到使用$吗?... 请帮我一点。

2 个答案:

答案 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”这样的模块。