2012-12-14 239 views
1

爲什麼我在運行以下代碼時收到錯誤消息「無法獲取屬性'未定義或空引用」無法獲取屬性'未完成'的未定義或空引用

new WinJS.Promise(initFunc).then(function() { 
         /* do something that returns a promise */ 
}).done(function() { 
         /* do something that returns a promise */ 
}).then(function() { 
         /* do something that returns a promise */ 
}).done(function() { 
}); 

回答

1

您只能在承諾鏈中調用done()一次,而且必須在鏈的末尾。在有問題的代碼,該done()功能在承諾鏈條兩次打電話:當你的代碼開始了與兩個獨立的承諾鏈,你最終會在以後的某個點一起把它們合併可能發生

new WinJS.Promise(initFunc).then(function() { 
}).done(function() {  <====== done() is incorrectly called here--should be then() 
}).then(function() {  <====== the call to then() here will throw an error 
}).done(function() {    
}); 

此問題的情況下,如下:

new WinJS.Promise(initFunc).then(function() { 
         /* do something that returns a promise */ 
}).done(function() {  <====== change this done() to a then() if you combine the two 
});        promise chains 

new WinJS.Promise(initFunc).then(function() { 
         /* do something that returns a promise */ 
}).done(function() { 
}); 
+0

您可以使用.join合併到承諾鏈,以在兩個完成時完成。我認爲這就是你要達到的目標。只需使用.then的結果,你會很好 –

0

你會得到同樣的錯誤只需:

new WinJS.Promise(initFunc).then(function() { 
}).done(function() { 
}); 

,因爲你在代碼3210沒有返回承諾,致電done

new WinJS.Promise(initFunc).then(function() { 
    // Return a promise in here 
    // Ex.: 
    return WinJS.Promise.timeout(1000); 
}).done(function() { 
}); 

而要回到你的初始代碼,因爲你在你的答案中提到不是你應該鏈中的多個done在一起。

+0

你是對的。我原來在代碼中有這樣的評論,但是刪除了它們以簡化示例。我會重新添加它們。 – RSW

相關問題