async/await 清楚,以睡眠为例
async/await clarity, with sleep example
我试图通过以下实现来掌握 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 毫秒后 resolve promise,等待 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
中的测试框架
您还没有等待您的 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);
})
只有 await
在等待,并且在 呼叫站点 。 await
也仅在 inside async
函数中有效。用法:
await promise;
将 async
函数视为编写 return 承诺函数的更好方法。这只是语法糖。
不可能隐藏嵌套在同步函数调用中的异步语义,而不更改调用它的所有函数的语义,使它们全部异步。考虑事情 return 在这个 运行 的事件循环或之后。
如果您想知道为什么异步语义不是默认语义,请阅读 why co-routines won't work on the web。
我试图通过以下实现来掌握 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 毫秒后 resolve promise,等待 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
您还没有等待您的 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);
})
只有 await
在等待,并且在 呼叫站点 。 await
也仅在 inside async
函数中有效。用法:
await promise;
将 async
函数视为编写 return 承诺函数的更好方法。这只是语法糖。
不可能隐藏嵌套在同步函数调用中的异步语义,而不更改调用它的所有函数的语义,使它们全部异步。考虑事情 return 在这个 运行 的事件循环或之后。
如果您想知道为什么异步语义不是默认语义,请阅读 why co-routines won't work on the web。