【发布时间】:2016-11-21 15:54:29
【问题描述】:
我是 Promise 概念的新手,并试图绕开我的脑袋,但现在我``在这里感到困惑
const request = require("request");
const cheerio = require("cheerio");
const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var url = require("url");
module.exports = {
resturant: resturant,
};
var resturanttables = [];
function resturant(url, day) {
return new Promise(function(resolve, reject) {
request(url, function(error, response, html) {
if (error) {
return reject(error);
} else if (response.statusCode !== 200) {
return reject("Something is wrong! CINEMA")
}
httplogin("zeke", "coys", url, day);
console.log(resturanttables, "i am here");
resolve(resturanttables);
});
});
}
function httpafterlogin(url, cookie, day) {
request.get({
headers: {
'content-type': 'text/html',
'Cookie': cookie
},
url: url,
},
function(error, response, body) {
console.log(day)
var $ = cheerio.load(body);
if (day === "Friday") {
$(".WordSection2 p span ").each(function(li) {
// console.log(day, $(this).text())
resturanttables.push($(this).text());
console.log(resturanttables, "nside");
});
} else if (day === "Saturday") {
$(".WordSection4 p span").each(function(li) {
resturanttables.push($(this).text())
});
} else {
$(".WordSection6 p span").each(function(li) {
resturanttables.push($(this).text())
});
}
});
}
function httplogin(username, password, urls, day) {
request.post({
headers: {
'content-type': 'application/x-www-form-urlencoded'
},
url: urls,
form: {
"username": username,
"password": password
}
}, function(error, response, body) {
var cookie = response.caseless.dict['set-cookie'][0];
var location = response;
console.log(response.statusCode);
cookie = cookie.substring(0, cookie.indexOf(';'));
// httpafterlogin('http://vhost3.lnu.se:20080/dinner/'+response.headers.location, cookie);
var newurls = url.resolve(urls, response.headers.location)
httpafterlogin(newurls, cookie, day);
// console.log(response.headers, "jdjdjjdjdjjdjdjdjjdjjdjdj")
});
}
然后我调用函数
loadPage.resturant("http://vhost3.lnu.se:20080/dinner/login", "Friday").then(function(data) {
console.log(data, "did it work now ")
})
问题是它返回空数组。但是当我尝试在 afterlogin 函数中检查和 console.log 时,我可以看到数组实际上已被填充,但该代码在 promise 被解决后运行。 简而言之:如何绑定餐厅中的 resolve 承诺在登录功能完成之前不发送数据?
换句话说,我如何从登录后功能中获取填充的数组?
【问题讨论】:
-
我没有发现任何问题...也许您遗漏了一些代码或什么?如果
data包含您的数组,那么一切都很好。 -
httpafterlogin需要与另一个相同的承诺设置。 -
但是我尝试了 Kevin B 但它不起作用
-
我没有看到你在你的问题中尝试过的地方,所以我无法评论你是如何错误地尝试的。
-
由于你是新的 promises,你会想看看我的rules of thumb。您违反了其中的多个。
标签: javascript node.js functional-programming promise