我是新的Node.js和承諾(在這裏,我使用Q.js)。 我試圖使刮板出其具有如下結構的網站:JQuery與嵌套循環的異步承諾
- main_page:已分類的列表,每個類別都有一個指向存儲頁面的列表的鏈接。
- 商店列表頁面:有一個商店列表,每個商店都有一個指向商店詳細信息頁面的鏈接。
- 商店詳細信息頁面:有我正在尋找的數據。
我做了第一個沒有承諾的工作方法,但結果代碼非常難看。所以我認爲這是使用承諾的好例子。
我不能得到這種方法的工作。當第二個循環完成時,應用程序不會繼續(它永遠不會執行end()方法)。另外,我不知道如何附加第三個循環。
我該怎麼辦?
function get(url) {
var deferred = Q.defer();
requestify.get(url).then(function(response) {
deferred.resolve(cheerio.load(response.getBody()));
});
return deferred.promise;
}
function process_main_page($) {
var promises = [];
$('.categories a').each(function(i) {
var deferred = Q.defer();
var storesList = $('.store');
get($(this).attr('href')).then(function($) {
deferred.resolve(process_stores_list(storesList));
});
promises.push(deferred);
});
return Q.all(promises);
}
function process_stores_list(storesList) {
var promises = [];
storesList.each(function() {
// Here I need to make another ajax call for each store detail page, which has the data that I need.
promises.push(deferred);
});
return Q.all(promises);
}
function end(res) {
var deferred = Q.defer();
fs.writeFile('output.json', JSON.stringify(myGatheredData, null, 4), function(err) {
deferred.resolve(function() {
res.send('File successfully written! - Check your project directory for the output.json file');
});
});
return deferred.promise;
}
app.get('/', function(req, res) {
get(url).then(process_main_page).then(end);
});
http:// jsfiddle。net/arunpjohny/v917j5ec/5/ – 2014-09-03 04:15:15
你的代碼充滿了延期反模式:(考慮閱讀並修復它。 – 2014-09-03 06:00:47