我并不是真正理解这段代码之间的区别:
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)。
答案 0 :(得分:4)
您展示的示例代码的两个主要区别:
doSomethingWith
的错误,请查看difference between .then(…).catch(…)
and .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的环境),或者当它与promises一起使用时用于向后兼容性(假设co支持更多类型的“yieldables”)。