我是新的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