我试图通过以下实现获得async / await的挂起但是它没有按预期工作
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
将在n毫秒后解析承诺,并等待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将在500ms后解决)
修改
mocha
答案 0 :(得分:5)
您尚未等待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 supports 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);
})
答案 1 :(得分:2)
只有await
等待,并且在呼叫网站。 await
也仅在 async
函数中有效。用法:
await promise;
将async
函数视为编写返回promise的函数的更好方法。这只是语法糖。
不可能隐藏嵌套在同步函数调用中的异步语义,而不会更改调用它的所有函数的语义,使它们都是异步的。考虑在事件循环的运行中或之后是否返回事物。
如果您想知道为什么异步语义不是默认语义,请阅读why co-routines won't work on the web。