我在JavaScript中使用链式承诺(我认为)。链中有一个then()函数。我想访问promise中的变量,或以某种方式通过我的HTTP响应对象返回变量。
var getTitle = function(response)
{
console.log("Starting getTitle. response: " + response); //this works
var horseman = new Horseman(); // object for headless browser
horseman
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0")
.open('http://www.google.com/ncr')
.type('input[name="q"]', 'github')
.click("button:contains('Google Search')")
.keyboardEvent("keypress",16777221) // press Enter
.waitForSelector("div.g")
.title() // gets the title of the page
.then(function(t) {
console.log("title: " + t); // this works
})
.close();
console.log("title outside: " + t); // this gives 'undefined'
return t; // returns 'undefined'
}
如何提取't'变量?我也尝试将“响应”传递给函数,如
.then(function(t, response) {
但是当我记录'响应'时,它是未定义的。如果我能以某种方式传递响应对象,那也可以。
如果我这样做
var test = horseman...
test成为promise对象,但它不包含t变量。
答案 0 :(得分:1)
尝试从.finally()中返回。
.finally(function(t){
return t;
});
答案 1 :(得分:1)
这样做了:
var getTitle = function(response)
{
console.log("Starting getTitle. response: " + response); //this works
var horseman = new Horseman(); // object for headless browser
var xyz = horseman
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0")
.open('http://www.google.com/ncr')
.type('input[name="q"]', 'github')
.click("button:contains('Google Search')")
.keyboardEvent("keypress",16777221) // press Enter
.waitForSelector("div.g")
.title() // gets the title of the page
.finally(function (t) {
horseman.close();
return t;
});
return xyz;
}
在通话功能中:
var abc = getTitle(response);
abc.then(function(abc) {
console.log("abc: " + abc);
response.writeHead(200, {'Content-Type': 'text/html'});
response.end(abc);
如果我在finally块中放入更多行代码,它就无法工作;我不知道为什么。我可以删除response
参数;需要测试一下。
答案 2 :(得分:0)
你不能return t
来自getTitle
,但你有两个选择。
1.在t
中使用then
内部回调函数执行所需操作,或将回调函数作为参数传递
var getTitle = function(response, callback) {
...
.then(function(t) {
callback(t);
});
2.从getTitle
返回承诺并使用then
处理回复。
return horseman;
...
var t = getTitle(response);
t.then(function(t){/* handle t */});