Разница между co и await


Я не совсем понимаю разницу между этим кодом:

co(function *() {
    const val = yield aPromise();
    return val;
})
.then((val) => doSomethingWith(val), (err) => doSomethingWith(err));

И этот другой:

async function () {
    try {
        const val = await aPromise();
        doSomethingWith(val);
    } catch (err) {
        doSomethingWith(err);
    }
}

Каковы плюсы/минусы (с точки зрения производительности, читаемости и управления потоком в основном) каждого кода, используемого в браузере или на сервере (узле.js) и почему следует использовать co (который зависит от внешней библиотеки co) или await (который еще не является частью ES7 и зависит от babel-polyfill).

1 3

1 ответ:

Два основных отличия для примера кода, который вы показали:

    Первый фрагмент выполняет функции и создает обещание, в то время как второй фрагмент просто объявляет функцию
  • первый фрагмент не ловит ошибок из doSomethingWith, Посмотрите на разницу между .then(…).catch(…) и .then(…, …).

Теперь, я думаю, что вы на самом деле хотели сравнить

var example = co.wrap(function *() {
    try {
        const val = yield aPromise();
        doSomethingWith(val);
    } catch (err) {
        doSomethingWith(err);
    }
})

И

async function example() {
    try {
        const val = await aPromise();
        doSomethingWith(val);
    } catch (err) {
        doSomethingWith(err);
    }
}

И, возможно,

function example() {
    return aPromise().then(doSomethingWith).catch(doSomethingWith);
}

(последний на самом деле имеет другое поведение, если aPromise бросает синхронно, что он, конечно, никогда не должен делать)

Итак, давайте обсудим

Производительность

Не имеет значения. На самом деле нет. Хотя третий может быть самым быстрым, потому что он создает наименьшее количество обещаний, а два других еще не оптимизированы хорошо в двигателях.

Читаемость

Выбирай сам. Первые два в значительной степени эквивалентны, хотя co немного некрасиво (злоупотребляет синтаксисом генератора). Третий довольно лаконичен и может быть одобрен из-за этого, хотя это преимущество быстро теряется для всего со сложным потоком управления.

Управление потоком

Это не вопрос плюсов / минусов, это должен быть тот, который вы хотите.

Почему следует использовать co или await?

co больше не должен использоваться, он заменен стандартным ES8 (ES2017) async/await (чего еще нет опубликовано, но все же). Он все еще может использоваться в качестве цели транспилятора (для сред, поддерживающих ES6, но не ES8) или для обратной совместимости, когда он использовался с чем-то другим, чем обещания (учитывая, что co поддерживает больше типов "доходных").