ясность async / await, с примером сна

Я пытаюсь повесить 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 миллисекунд, а await следует 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


person harishr    schedule 25.05.2017    source источник
comment
Вы никогда не ждете результата в своем тесте, когда вызываете Utilities.sleep(500); См. github.com/jasmine/jasmine/issues / 923   -  person Igor    schedule 25.05.2017
comment
async функция - это просто функция, которая возвращает обещание. Вызов этого волшебным образом не превратит асинхронный код в синхронный. Непонятно, в чем вопрос. Это об асинхронной функции или тестах? Если первое, то тестовый пример не имеет значения. Если последнее, то вопрос отсутствует, даже не упоминается, какой фреймворк для тестирования вы используете. Так это о тестировании или об async / await?   -  person Estus Flask    schedule 25.05.2017
comment
@estus Я знаю, что это не волшебство, и поэтому пытаюсь узнать что-то, чего я не понимаю. вопрос о реализации sleep в javascript   -  person harishr    schedule 26.05.2017
comment
Возможно, стоит отметить, что ваш sleep() метод не добавляет значения по сравнению с _sleep(). Оба они возвращают обещание, которое разрешается через ms миллисекунды и может использоваться взаимозаменяемо.   -  person user3432422    schedule 26.05.2017
comment
@ user3432422 отличный момент, большое спасибо за эту информацию   -  person harishr    schedule 26.05.2017


Ответы (2)


Вы не дождались своего 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);
})
person unional    schedule 25.05.2017
comment
но я ждал в sleep, чем это отличается от ожидания в test - person harishr; 25.05.2017
comment
Вам также нужно дождаться sleep(500), когда вы его вызовете. - person unional; 25.05.2017
comment
добавлен await также в тесте (await Utilities.sleep (500)), но он тоже не работает. - person harishr; 26.05.2017
comment
Может быть, ваш тестовый бегун не поддерживает асинхронный режим? - person unional; 26.05.2017
comment
@unional Это то, что происходит, когда ответы на плохие вопросы оказываются плохими. В OP не указана среда тестирования и указано, что это не важно, но, конечно, имеет значение. - person Estus Flask; 26.05.2017
comment
@estus это не так уж и плохо, я уже сделал отказ от ответственности, что если средство запуска тестов поддерживает async. :) - person unional; 26.05.2017
comment
Вероятно, в ответе следует отметить, что это относится к Mocha (нет такой вещи, как поддержка функции async, но Mocha поддерживает возврат обещаний). - person Estus Flask; 26.05.2017
comment
Это также может быть jest с таким же синтаксисом - person unional; 26.05.2017

Ожидает только await и на call-site. await также допустим только внутри async функций. Использование:

await promise;

Думайте о функции async как о лучшем способе написания функции, возвращающей обещание. Это просто синтаксический сахар.

Невозможно скрыть асинхронную семантику, вложенную в вызовы синхронных функций, без изменения семантики всех вызывающих ее функций, сделав их все асинхронными. Подумайте, вернутся ли вещи в этом прогоне цикла событий или позже.

Если вам интересно, почему асинхронная семантика не используется по умолчанию, прочтите почему совместные подпрограммы не работают в Интернете.

person jib    schedule 26.05.2017