【发布时间】:2019-06-23 02:28:14
【问题描述】:
我想解析地址查询并返回地址及其标题,这样 http://localhost:3000/I/want/title/?address=google.com&address=youtube.com 应返回: google.com - 'google',youtube.com - 'youtube'
我正在使用 Cheerio.js 从 URL 中提取标题,但这需要时间,并且 res.render 行在变量标题填充 URL 标题之前执行。如何确保检索标题的代码在 res.render 之前执行?
到目前为止,我没有收到任何错误,但标题[] 数组在没有数据的情况下发送到我的 .ejs 文件。我尝试通过回调、step.js、async.js 解决这个问题,但似乎没有任何效果。我尝试使用 rsvp.js(promise)解决它,如下所示(来自 app.js),但它也不起作用,titles[] 仍然为空:
app.get("/I/want/title/", function(req,res){
if (typeof req.query.address === "string"){
query = [req.query.address];
}
else {
query = req.query.address;
}
var titles=[];
var promise = new RSVP.Promise(function(resolve, reject) {
for (i=0;i<(query.length);i++){
if (!((query[i]).startsWith("https://www."))){
var url = "https://www." + query[i];
}else{
url=query[i];
}
request(url, function (err, resp, body) {
if (err) {
var title = "NO RESPONSE"
} else {
var $ = cheerio.load(body);
var title = $("title").text();
}
titles.push(title);
});
}
resolve(titles);
reject();
});
promise.then(function(titles) {
res.render("title", {url: query, siteName: titles});
}).catch(function() {
console.log("oh no");
});
});
我的语法或逻辑有问题吗?我应该如何使用回调或承诺执行此操作?
【问题讨论】:
-
你让自己的生活变得艰难,试图用一个
new Promise()来做到这一点。即使在回调中使用resolve(totles),第一个响应的request()也会解析promise,而其他所有的都会被忽略。
标签: javascript node.js promise callback