Typescript 异步/等待清晰,以睡眠为例
我试图通过下面的实现了解async/await,但它并没有按预期工作Typescript 异步/等待清晰,以睡眠为例,typescript,async-await,mocha.js,es6-promise,ecmascript-2017,Typescript,Async Await,Mocha.js,Es6 Promise,Ecmascript 2017,我试图通过下面的实现了解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) =
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 should sleep for 500 ms FAILED
AssertionError: expected 2 to be at least 500
我的理解是:sleep
将等待\u sleep
的承诺得到解决(根据setTimeout,该承诺将在500ms后得到解决)
编辑
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);
})
只有
wait
waitis,并且在呼叫站点<代码>等待也仅在异步
函数中有效。用法:
await promise;
将async
函数视为编写返回承诺的函数的更好方法。只是语法上的糖
如果不改变调用它的所有函数的语义,使它们都是异步的,就不可能隐藏嵌套在同步函数调用中的异步语义。考虑在事件循环的运行过程中是否返回了。
如果您想知道为什么异步语义不是默认语义,请阅读。当您调用
Utilities.sleep(500)时,您从不等待测试结果代码>请参见async
函数只是一个返回承诺的函数。调用它不会神奇地将异步代码变成同步代码。问题是什么还不清楚。是关于异步函数还是测试?如果是前者,那么测试示例就无关紧要了。如果是后者,那么问题就不存在了,它甚至没有提到您使用的测试框架。那么,这是关于测试还是关于异步/等待?@estus我知道这不是魔法,因此试图学习一些我不懂的东西。问题在于JavaScription中的sleep
实现。可能值得注意的是,您的sleep()
方法没有为\u sleep()
添加任何值。它们都返回一个在ms
毫秒后解析的承诺,并且可以互换使用。@user3432422很棒的一点,非常感谢您提供的信息,但是我在sleep
中进行了等待,这与test
中的等待有何不同?您还需要等待sleep(500)
当您调用它时。添加了wait
也在测试中(wait Utilities.sleep(500)),但这也不起作用。可能您的测试运行程序不支持异步?@unional这就是当回答了糟糕的问题时会发生的情况,它们会导致糟糕的答案。OP没有指定测试框架,并表示它并不重要,但当然,它很重要。
await promise;