javascript - co 和 await 的区别

标签 javascript node.js babeljs co ecmascript-2017

我不是很理解这段代码之间的区别:

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 (取决于 co external library )或 await (这还不是 ES7 的一部分,取决于 babel-polyfill )被使用。

最佳答案

您显示的示例代码的两个主要区别:

现在,我想你真正想要比较的是

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 同步抛出,最后一个实际上有不同的行为,当然它永远不应该这样做)

所以让我们讨论一下

performance

没关系。真的不。虽然第三个可能是最快的,因为它创建的 promise 最少,而另外两个在引擎中还没有得到很好的优化。

readability

选择你自己。前两个几乎是等价的,尽管 co 有点难看(滥用生成器语法)。第三个非常简洁,因此可能会受到青睐,尽管对于具有复杂控制流的所有事物来说,这种优势很快就会消失。

flow control

这不是优劣的问题,必须是你想要的。

why should co or await be used?

co 不应再使用,它​​已被标准 ES8 (ES2017) async/await 取代(尚未发布,但仍然)。它可能仍然用作转译器目标(对于支持 ES6 但不支持 ES8 的环境),或者当它用于 promises 以外的其他东西时用于向后兼容(假设 co 支持更多类型的“yieldables”)。

关于javascript - co 和 await 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39847461/

相关文章:

node.js - 从 Node.js 调用 C++ 库 (Node addons/node-ffi)

javascript - 带有 NodeJS 的 Babel 不工作传播运算符

javascript - yarn 在 Windows 上慢 5 倍

javascript - 如何在 Typescript 中强制一段代码等待 API 调用完成?

javascript - 使用 JSON.stringify() 和 JSON.parse() 时的 Date() 问题

ios - 近距离 gps 位置的算法

javascript - knockout 计算在页面加载时执行

javascript - Botmaker 解决 Qnamaker 后续问题

javascript - 带有 React : Unexpected token '<' in call to renderToString() 的 SSR

javascript - 为什么这个 JSX 表达式会产生奇怪的结果?