如何将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
}
有什么想法吗?
答案 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