2012-06-27 85 views
1

我正在使用Windows 8 JavaScript應用程序,而WinJS.Promise沒有像我期望的那樣工作。這裏是我的異步方法...WinJS.Promise不按我期望的那樣工作

function MyFiveSecondFunctionAsync() { 
    return new WinJS.Promise(function (c, e, p) { 
     var start = new Date().getTime(); 
     var delay = 5000; 
     while (new Date().getTime() < start + delay) p(); 
     c(); 
    }); 
} 

這裏就是我有...

document.querySelector("#status").innerText = "working"; 
MyFiveSecondFunctionAsync().done(function() { 
    document.querySelector("#status").innerText = "done"; 
}); 
document.querySelector("#status").innerText = "free"; 

這是一個按鈕,點擊調用它。我希望我的狀態div在我單擊按鈕後很簡短地說「工作」,但是在5秒內說「空閒」,最後在5秒延遲結束時說「完成」。相反,UI線程阻塞了5秒,然後狀態div顯示「free」。

我認爲執行會返回到將狀態設置爲「空閒」的行,但調試表明它在此之前觸發了promise函數。所以5秒後狀態設置爲「完成」,然後設置爲「空閒」。換句話說,我的異步函數只是不會異步操作。

+1

承諾不創建線程。如果您運行旋轉循環,則會阻止UI線程。特別是,您傳遞給'WinJS.Promise'的函數在創建promise時同步運行,因此您在構建過程中正在執行旋轉循環。看起來你正在嘗試創建超時承諾。對此已經有Promise.timeout了。 –

+0

謝謝,雷蒙德!我誤解了它。 –

回答

3

正如Raymond在評論中提到的那樣,我認爲承諾會創建一個不是這樣的新線程。承諾僅僅提供了一種方便的方式來「在完成其他事情時做些事情」,作爲指定回調函數和潛在進入嵌套回調的聖誕樹問題的替代方法。

相關問題