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 外部库)或 await (这是还不是 ES7 的一部分,并且依赖于babel-polyfill)被使用。

4

1 回答 1

5

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

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

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 支持更多类型的“yieldables”)。

于 2016-10-21T06:29:34.980 回答