async / await clarity,with sleep示例

时间:2017-05-25 13:26:25

标签: typescript async-await mocha 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) => 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

中的测试框架

2 个答案:

答案 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