Разница между 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);
    }
}

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


person David    schedule 04.10.2016    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что сравнение не имеет смысла.   -  person Amit    schedule 04.10.2016
comment
Перебор в обоих случаях :). aPromise().then() будет достаточно. :)   -  person Yury Tarabanko    schedule 04.10.2016
comment
@Amit, почему это не имеет смысла? Не могли бы вы немного объяснить, чтобы лучше понять? Основная проблема в том, что я не понимаю, почему это не имеет смысла...   -  person David    schedule 04.10.2016
comment
Есть много способов сделать практически все в мире Javascript. Сравнивать друг с другом вряд ли продуктивно. Существует явное различие в синтаксисе, которое является очевидным отличием (кроме внешних зависимостей). Выбирайте.   -  person deceze♦    schedule 04.10.2016
comment
@deceze, значит, нет разницы в производительности?   -  person David    schedule 04.10.2016
comment
Если вас беспокоит производительность, сравните ее.   -  person deceze♦    schedule 04.10.2016
comment
Это не имеет смысла, поскольку версия await нигде не реализована и может быть перенесена только примерно в первую версию. Это все равно, что спросить, когда вы будете использовать исходный код или скомпилированный код.   -  person Amit    schedule 04.10.2016
comment
который еще не является частью ES7 и никогда не будет. ES7 (ES2016) был выпущен в этом году. async/await будет выпущен в следующем году как часть ES2017.   -  person Felix Kling    schedule 21.10.2016


Ответы (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 поддерживает больше типов «доходных значений»).

person Bergi    schedule 21.10.2016