co和await之间的区别

4
我不太理解这段代码的区别:

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,或者依赖于babel-polyfill但尚未成为ES7的一部分的await?请说明原因。

我投票关闭此问题,因为比较毫无意义。 - Amit
@Amit,为什么这没有意义?你能稍微解释一下让我更好地理解吗?主要问题是我看不出来为什么它没有意义... - David
1
在Javascript世界中,实现每个功能的方式有很多种。相互之间进行比较几乎没有什么实际意义。语法上存在明显差异,这是显而易见的不同点(除了外部依赖)。根据你的需要进行选择即可。 - deceze
1
如果你关心性能,就对其进行基准测试。 - deceze
"不过 async/await 并不是 ES7(即 ES2016)的一部分,也永远不会成为其一部分。async/await 将作为 ES2017 的一部分在明年发布。" - Felix Kling
显示剩余3条评论
1个回答

7
你提供的示例代码有两个主要区别:

现在,我认为你实际想要比较的是

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的环境),或者在它与除了Promise以外的其他内容一起使用时,用于向后兼容(因为co支持更多类型的“yieldables”)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接