2017-05-25 53 views
2

我試圖讓下面執行異步/等待着掛但預期之後n毫秒異步/等待清晰,睡眠例如

public static async sleep(ms: number): Promise<void> { 
     await Utilities._sleep(ms); 
    } 

    private static _sleep(ms: number): Promise<{}> { 
     return new Promise((resolve: Function) => setTimeout(resolve, ms)); 
    } 

_sleep會解決承諾它不工作,伺機應該sleep到那時..

但低於礦的測試失敗

it("should sleep for 500 ms",()=> { 
    const date1 = (new Date()).getTime(); 
    Utilities.sleep(500); 
    const date2 = (new Date()).getTime(); 
    chai.expect(date2 - date1).to.least(500); 
}) 

與消息

sleep should sleep for 500 ms FAILED 
    AssertionError: expected 2 to be at least 500 

我的理解是:sleep將等待,直到從_sleep承諾解決(其中按setTimeout的將500毫秒後解決)

編輯

mocha

+5

當您調用'Utilities.sleep(500);'請參閱https://github.com/jasmine/jasmine/issues/923 – Igor

+0

'async'函數只是一個函數返回時,您從不等待測試結果一個承諾。調用它不會奇蹟般地將異步代碼轉換爲同步代碼。目前還不清楚問題在哪。它是關於異步函數還是測試?如果前者,那麼測試例子是無關緊要的。如果是後者,那麼這個問題就不存在了,甚至沒有提到你使用的是哪個測試框架。那麼是關於測試還是關於異步/等待? – estus

+0

@estus我知道它不是魔術,因此試圖學習一些我不明白的東西。問題是關於在javascript中實現'sleep' –

回答

4

測試框架您沒有等待您的sleep()電話(如@igor所述):

簡化版:

async function sleep(ms: number) { 
    await _sleep(ms); 
} 

function _sleep(ms: number) { 
    return new Promise((resolve) => setTimeout(resolve, ms)); 
} 

console.time('start') 
sleep(500).then(() => { 
    console.timeEnd('start') 
}) 

// If your test runner support async: 
it("should sleep for 500 ms", async() => { 
    const date1 = (new Date()).getTime(); 
    await sleep(500); 
    const date2 = (new Date()).getTime(); 
    chai.expect(date2 - date1).to.least(500); 
}) 
+0

,但我已經等待'睡眠',這是什麼不同於'測試'等待# –

+0

當你打電話時,你還需要等待睡眠(500)'。 – unional

+0

也在測試中添加了'await'(等待Utilities.sleep(500)),但那也不起作用。 –

2

只有await等待着,並在調用點await也只是裏面async功能。用法:

await promise; 

一個async功能只是一個寫返回一個承諾函數的更好的方式的思考。這只是語法糖。

不可能隱藏嵌套在同步函數調用中的異步語義,而不會改變調用它的所有函數的語義,使它們全部是異步的。考慮一下事件循環的運行是否返回。

如果您想知道爲什麼異步語義不是默認語義,請閱讀why co-routines won't work on the web