2016-04-14 32 views
0

Artık Express.js kullanarak Node.js Uygulaması yapıyorum. Diğer siteden bazı verileri gösteren bir sayfam var. Bu yüzden Cheerio.js ile kullanıyorum ve sorun değil, ama sorun şu ki, hurda işi tamamlandığında nasıl işleyebilirim? Aşağıdaki gibi bir kod yaptım, lütfen bakın. bazı yollar yapmakNode.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 }); 

Düşünce,

# 1 - Render zamani == 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 - geri arama getData (ile)

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) 

Nasıl yapabilirim Bu şey mi? Kullanım Promise? ... Kullanmalı mıyım? Lütfen bazı noktalarda bana yardımcı olun.

+0

Bu Promise' için tavsiyem – kiro112

+0

@ kiro112 Derlenmiş şablonun ne olduğunu bilmiyorum ... sadece birkaç sayı. – Juntae

cevap

2

burada

size yardımcı olabilecek sözler

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

Teşekkürler. ama var vaatler = []; ve Promise.all (vaatler) .then ... 'Arzu edilen dizi dizisi dolmadan önce yürütülen() işlevi. – Juntae

+0

, böylece data_set boş. Bu çok zor .... – Juntae

+0

hayır, her 'getData' işlevi 'Promise.all' çağrısı sırasında çözülecek ve daha sonra 'o zaman' tamamlanmış sonuçlara sahip olacaksınız –

0

İçiçe geri aramaları kullanarak bunu nasıl olduğunu ... gerçekten size kalmış ya taahhütte veya async.js kütüphane kullanmalıdır. GetData işlevini tek tek arayabilir ve her geriçağırım işlevinde data_set öğesine içerik ekleyebilirsiniz.

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

    } 

}); 

geri arama cehennem önlemek için, ayrıca "zaman uyumsuz", "q", "vaat" gibi modülünü kullanabilirsiniz.