co和await之间的区别

时间:2016-10-04 08:21:32

标签: 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) <等待(或不等于ES7的一部分,取决于babel-polyfill)。

1 个答案:

答案 0 :(得分:4)

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

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

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的环境),或者当它与promises一起使用时用于向后兼容性(假设co支持更多类型的“yieldables”)。