Typescript 异步/等待清晰,以睡眠为例

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) =

我试图通过下面的实现了解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 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;