2013-09-29 135 views
0

如何將Google的範圍綁定到fetch_page函數?我需要能夠將這些功能鏈接在承諾鏈中。原型,範圍和承諾

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 
} 

任何想法?

+1

您是否嘗試過'fetch_page.call(本)。然後(函數(R){執行console.log( 「完成」);})'? –

+0

這是如何將第二個承諾與呼叫鏈接在一起(這個)。這不會觸發該功能而不是提供範圍嗎? – lededje

回答

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墊片」以查找多個選項。

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

我使用promised-io但.bind工作的一種享受。謝謝你的幫助。 – lededje

+0

Promise-io是服務器端nodejs,所以我都很好:) – lededje

+0

@lededje:啊,挺好的! :-) –

-3

像這樣

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

google.keyword // get the public class variable called keyword 
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(...); 
+0

我不想泡,儘管所有的功能後來。有沒有其他的方式來綁定它? – lededje

+0

@lededje查看更新... – Alnitak

+0

這也是正確的,但不像TJs的答案那樣完整。 +1雖然。 – lededje