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