2016-04-14 5 views
0

私はExpress.jsを使ってNode.jsアプリケーションを作っています。私は他のサイトからいくつかのデータをレンダリングするページを持っています。 Cheerio.jsで使用していますが、問題はありませんが、問題は、廃棄作業が完了したときにどのようにレンダリングできるかわかりません。私は以下のようなコードを作った、見てください。いくつかの方法がそれを行うにはNode.jsタスクが完了したときのres.render

var urls = [ 'http://a.com/fruits', 'http://a.com/cars', 'http://a.com/toys' ] 

function getData(){ 

// get html and parse, return some data. 
    ...  
} 

var data_set = ''; 

for (var i=0; i< urls.length ; i++){ 
    data_set += getData(urls[i]); 
} 

// When get all data, render <------ How can I catch when? 
res.render('some_page', { data : data_set }); 

思想、

#1 - レンダリング時にi == urls.length

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. 

#2 - コールバックのgetData(と)

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) 

私はどうすればできますかこれを避けますか?私は使用する必要がありますPromise?... いくつかの点で私を助けてください。

+0

私はこのことを約束しています – kiro112

+0

@ kiro112私はコンパイルされたテンプレートが何であるか分かりません。 – Juntae

答えて

2

あなたがここに

はあなたを助けるかもしれない約束

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

ありがとうございます。しかし、 'var promises = []; Promises.all(約束).then ... '約束の配列が満たされる前に実行されたthen()関数。 – Juntae

+0

ですから、data_setは空です。それはとても難しい.... – Juntae

+0

それはない、それぞれの 'getData'関数は 'Promise.all'呼び出し中に解決され、後で 'then'はあなたのすべての完了した結果 –

0

ネストされたコールバックを使用してそれを行うことができる方法です...本当にあなた次第どちらか約束かasync.jsライブラリを使用する必要があります。 getData関数を1つずつ呼び出し、各コールバック関数の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 }); 
     } 

    } 

}); 

コールバックhellを避けるために、 "async"、 "q"、 "promise"のようなモジュールを使用することもできます。

関連する問題