2015-07-10 86 views
1

這兩個函數寫在javascript之間有什麼區別?兩個函數的區別

function 1

var a, b; 

this.get('obj').then(function(ob) { 
    a = ob.get('prop'); 
}.bind(this)).then(function() { 
    this.get('obj').reload(); 
}.bind(this)).then(function(){ 
    b = this.get('obj.prop')  
}.bind(this)) 

function 2

this.get('obj').then(function(ob) { 
    a = ob.get('prop'); 
}.bind(this)).then(function(){ 
    this.get('obj').reload().then(function(){ 
     b = this.get('obj.prop'); 
    }.bind(this)) 
}.bind(this)) 

第一個是錯誤的。

+1

嘗試將其更改爲'return this.get('obj')。reload();' – rampion

+0

它會產生什麼區別? – Ninja420

+0

當給予'then()'的回調函數返回一個promise時,下一個調用'then()'的鏈將等待這個承諾先解析。 – rampion

回答

4

我在代碼中添加了一些標記以供參考。

這是片斷2:

this.get('obj').then(function(ob) { // #1 
    a = ob.get('prop'); 
}.bind(this)).then(function() { // #2 
    this.get('obj').reload().then(function() { // #3 
     b = this.get('obj.prop'); 
    }.bind(this)) 
}.bind(this)); 

現在,所不同的是,它的guarantied該回調#3將被調用的重載方法完成後,換言之 - 可變b後,才重裝承諾進行初始化已解決。

另一方面,在第一個片段中,變量b獨立於reload承諾的狀態進行初始化。

演示:這裏是給你演示直觀的看到差別http://jsfiddle.net/fn93gz3w/(刪除虛假& &運行片段)。

最後,你可以做第一個片段行爲相同,第二個(正確),如果你從第二then塊返回新承諾:在這種情況下諾言得到鏈接並與b初始化第三回調將等到reload解決。檢查我的演示中的這種行爲。

+0

由於回調#2啓動了重裝,但不等待它完成,所以第1片失敗。 – rampion

+0

@rampion不一定會失敗,這取決於業務邏輯。如果'b'需要等待重新加載,那麼肯定會失敗。 – dfsq