【问题标题】:Prototypes, scope and Promises原型、范围和承诺
【发布时间】:2013-09-29 17:27:01
【问题描述】:

如何将 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
}

有什么想法吗?

【问题讨论】:

  • 你试过fetch_page.call(this).then(function (r) { console.log("done"); })吗?
  • 这是如何将第二个承诺与调用链接起来。(this)。这不会触发功能而不是提供范围吗?

标签: javascript promise


【解决方案1】:

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

然后是 ES5 的 Function#bind 或 jQuery 的 $.proxy(我认为您正在使用 jQuery,从您使用的 Promise 来看,但这是一个猜测 - 更新:我错了,但是我会留下信息,以防人们使用 jQuery 找到答案)来创建 parse_page 的绑定版本(即,一个函数,当被调用时,将使用特定的 this avlue 调用 parse_page)。

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');
    });
});

【讨论】:

  • 我使用的是promised-io,但.bind 奏效了。感谢您的帮助。
  • @lededje:啊,确实如此! :-)
【解决方案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(...);

【讨论】:

  • 我真的不想冒泡,尽管之后所有的 then 功能。没有其他方法绑定吗?
  • 这也是正确的,但不如 TJ 的回答那么完整。虽然 +1。
  • @lededje 我不想假设你正在使用 jQuery
  • @Alnitak:我首先包含了 ES5,然后是 jQuery 作为一个选项。 (我错了,lededje 没有使用 jQuery,这是服务器端!):-)
【解决方案3】:

这样

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多