2012-09-09 103 views
1

我想要一個簡單的方法來將暫停添加到某些與承諾鏈接在一起的東西。擴展WinJS Promise對象

我認爲這將是很好,包括「等待」的方法,所以我可以寫這樣的東西:

var promise = new WinJS.Promise(function(complete){ 
    whatever() 
}).wait(1000).then(function(){ 
    whatever2(); 
}).wait(500).done(function(){ 
    alldone(); 
} 

因此,要做到這一點,我添加了一個wait方法的承諾類,像這樣:

if (WinJS.Promise.prototype.wait == null) { 
    WinJS.Promise.prototype.wait = function (milliseconds) { 
     var promise = new WinJS.Promise(function (complete) { 
      setTimeout(complete, milliseconds); 
     }); 
     return promise; 
    } 
} 

它似乎在工作,但我注意到如果我使用「then」,那麼我從它得到的對象,而文檔說的是WinJS.Promise,不會有等待函數。我創建了所有承諾確實有等待功能,但調用。那麼()中承諾將導致後續.wait失敗,所以......

promise.wait(300).then().done(); 

是沒有問題的,但是:

promise.then().wait(300).done(); 

會錯誤地指出從then()返回的Promise沒有等待方法。

任何人都可以解釋我做錯了什麼?

回答

3

有兩個原因導致您的代碼無法正常工作。

第一個是Microsoft使用他們自己的方法來創建對象實例,他們通過WinJS.Class命名空間來完成 - 這意味着您正在改變的原型在添加wait函數時不會應用到您正在代碼中使用的對象爲WinJS.Promise

第二個問題是,您的目標錯了對象 - 在WinJS.Promise.then方法調用WinJS.Promise.as它返回一個CompletePromise對象 - 所以,即使你可以讓你的wait功能棒,這將是在錯誤的地方。 CompletePromise定義不在公共範圍內,因此您必須進行大量黑客行爲才能進行所需的更改。

There is a solution,but you have to use the WinJS.Promise.timeout method。你不能使用這個內聯,這意味着要得到你想要的效果,你需要一些稍微笨拙的代碼,如下所示;

var promise = new WinJS.Promise(function (complete) { 
    whatever(); 
    complete(); 
}).then(function() { 
    return WinJS.Promise.timeout(1000); 
}).then(whatever2).then(function() { 
    return WinJS.Promise.timeout(500); 
}).then(alldone); 
2

這不是你的問題的直接答案。除非then()返回一個看起來像Promise的對象,類似於Promise,但實際上不是Promise,否則將wait()方法添加到Promise的原型應該確實有效。

也就是說,您不必首先實施wait()方法,因爲Promise已經公開了執行相同操作(甚至更多)的timeout()方法。您正在尋找其單參數表單:

var promise = new WinJS.Promise(function(complete) { 
    whatever(); 
}).timeout(1000).then(function() { 
    whatever2(); 
}).timeout(500).done(function() { 
    alldone(); 
}); 
+0

感謝您的回覆。我認爲你的回報類型並非真正的承諾是正確的,即使智能感知文件說明了這一點。我曾看過超時選項,但不能將其稱爲Promise實例。你可以調用WinJS.Promise。timeout(1000),但你不能像這樣在一個鏈中使用它:var o = new WinJS.Promise(function(){})。timeout(1000);這正是我試圖用我的等待功能做的事情。 – chrismay