我有一个承诺链,请求RSS URL,解析链接,然后需要请求每个链接。第一部分效果很好。但是,我无法解决如何“插入请求”以请求每个已解析的链接。
我开始生成一个简单的链接URL数组(首选方法),但无法使其工作。代码现在生成一个promises数组来请求每个URL,但我不知道如何使这个工作。也许我需要使用Q.all(),但这似乎是预定的功能?
requestRss(rssSourceUrl)
.then(function(links) {
// ???
})
.catch(function(error) {
console.log(error);
})
.done();
function requestRss(url) {
var deferred = q.defer();
request(url, function(err, resp, body) {
if (err || resp.statusCode !== 200) {
deferred.reject(new Error(resp.statusCode + ' ' + err + ' ' + body));
} else {
$ = cheerio.load(body);
var linkRegex = /<link>([^<$]+)/gim;
var someLinks = new Array();
$('item').each(function() {
var match = linkRegex.exec($(this).html());
if (match) {
var link = match[1];
someLinks.push(
function() { requestSomeLink(link); }
);
}
});
deferred.resolve(someLinks);
}
});
return deferred.promise;
}
function requestSomeLink(url) {
var deferred = q.defer();
request(url, function(err, resp, body) {
if (err || resp.statusCode !== 200) {
deferred.reject(new Error(resp.statusCode + ' ' + err + ' ' + body));
} else {
$ = cheerio.load(body);
deferred.resolve(body);
}
});
return deferred.promise;
}
答案 0 :(得分:2)
现在代码生成一个promises数组来请求每个URL
实际上它是一个函数数组,每个函数都会在调用时产生对url请求的承诺。我认为你应该简单地使它成为一个链接(字符串)数组,仅此而已 - 它们发生的事情是在另一个函数中确定。所以
function requestLinksFromRss(url) {
…
if (match)
someLinks.push(match[1]);
…
return deferred.promise;
}
也许我需要使用Q.all(),但这似乎适用于预定的功能?
我看不出“预定功能”的含义。 Q.all()
只是将一系列的承诺作为其论据。这就是我们在这里所拥有的。
requestLinksFromRss(rssSourceUrl).then(function(links) {
var promiseArr = links.map(requestSomeLink); // or a loop if you want
return Q.all(promiseArr);
}).then(function(ressources) {
// now you have an array of request bodies.
// Do something with them.
}).catch(console.log.bind(console)).done();
答案 1 :(得分:1)
您没有生成“承诺数组”,而是最终会返回承诺的一系列函数。 你在哪里称这些功能?
假设您返回返回一系列链接,并且仍然具有您的requestSomeLink(url)功能。
requestRss(rssSourceUrl)
.then(function(links) {
var index;
for (index = 0; index < links.length; index++) {
requestSomeLink(links[index]).then(function(data) {
// do something with data
}
}
})