原型,范围和承诺

时间:2013-09-29 09:16:10

标签: javascript promise

如何将Google的范围绑定到fetch_page函数?我需要能够在promise-then链中将函数链接在一起。

Google.prototype.search = function(keyword){
    this.keyword = keyword || this.keyword;

    fetch_page().then(parse_page).then(function(){
        console.log('done');
    });
});

function fetch_page(){
    // I wants to access google's this.keyword
}

function parse_page(){
    // I also wants to access google's this.keyword
}

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

Function#call可用于调用fetch_page,指定要用作this的值:fetch_page.call(this)

然后是ES5的Function#bind或jQuery的$.proxy(我认为你使用的是jQuery,来自你正在使用的承诺,但它是猜测 - 更新:我是错的,但是我会保留信息,以防人们使用jQuery找到答案)来创建parse_page的绑定版本(也就是说,一个函数,当被调用时,将调用parse_page具体this avlue)。

Function#bind

Google.prototype.search = function(keyword){
    this.keyword = keyword || this.keyword;

    fetch_page.call(this).then(parse_page.bind(this)).then(function(){
        console.log('done');
    });
});

请注意Function#bind来自ES5,因此您需要检查所需的所有浏览器是否都有。如果没有,它是可以在旧版浏览器上“填充”的ES5功能之一;搜索“ES5 shim”以查找多个选项。

jQuery的$.proxy

Google.prototype.search = function(keyword){
    this.keyword = keyword || this.keyword;

    fetch_page.call(this).then($.proxy(parse_page, this)).then(function(){
        console.log('done');
    });
});

答案 1 :(得分:2)

为简单起见,我会选择:

fetch_page(keyword).then(function() {
    parse_page(keyword);
}).then(function(){
    console.log('done');
});

然后将keyword添加到两个外部函数的参数列表中。

或者,只需内联Google.prototype.search中的两个函数,以便它们共享相同的范围。

第三种方法是.bind将函数显式设置为this对象的函数:

var fetch = fetch_page.bind(this);
var parse = parse_page.bind(this);

fetch().then(parse).then(...);

答案 2 :(得分:-3)

喜欢这个

var google = new Google(); // return the class instance

google.keyword // get the public class variable called keyword