Разница между ко и жду

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

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);
    }
}

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

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 поддерживает больше типов "выходных данных").

Другие вопросы по тегам