访问Javascript promise链中的变量

时间:2016-02-05 15:47:18

标签: javascript methods promise httpresponse chain

我在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变量。

3 个答案:

答案 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 */});