co 和 await 的区别
Difference between co and await
我不是很理解这段代码的区别:
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)中使用的每个代码的pros/cons(主要是在性能、可读性和流量控制方面)是什么以及为什么要合作(这取决于co external library) or await (which is not part of ES7 yet and depends on babel-polyfill) 被使用。
您显示的示例代码的两个主要区别:
- 第一个代码片段执行函数并创建一个 promise,而第二个代码片段只声明一个函数
- 第一个片段没有捕获来自
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
同步抛出,最后一个实际上有不同的行为,当然它永远不应该这样做)
所以让我们讨论一下
performance
无所谓。真的不。虽然第三个可能是最快的,因为它创建的承诺最少,而另外两个在引擎中还没有得到很好的优化。
readability
选择你自己。前两个几乎是等价的,尽管 co
有点难看(滥用生成器语法)。第三种非常简洁,因此可能会受到青睐,尽管对于具有复杂控制流的所有事物来说,这种优势很快就会消失。
flow control
这不是pros/cons的问题,一定是你想要的
why should co or await be used?
co
不应再使用,它已被标准 ES8 (ES2017) async
/await
取代(尚未发布,但仍然如此)。它可能仍然用作转译器目标(对于支持 ES6 但不支持 ES8 的环境),或者当它用于 promises 以外的其他东西时用于向后兼容(假设 co 支持更多类型的 "yieldables")。
我不是很理解这段代码的区别:
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)中使用的每个代码的pros/cons(主要是在性能、可读性和流量控制方面)是什么以及为什么要合作(这取决于co external library) or await (which is not part of ES7 yet and depends on babel-polyfill) 被使用。
您显示的示例代码的两个主要区别:
- 第一个代码片段执行函数并创建一个 promise,而第二个代码片段只声明一个函数
- 第一个片段没有捕获来自
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
同步抛出,最后一个实际上有不同的行为,当然它永远不应该这样做)
所以让我们讨论一下
performance
无所谓。真的不。虽然第三个可能是最快的,因为它创建的承诺最少,而另外两个在引擎中还没有得到很好的优化。
readability
选择你自己。前两个几乎是等价的,尽管 co
有点难看(滥用生成器语法)。第三种非常简洁,因此可能会受到青睐,尽管对于具有复杂控制流的所有事物来说,这种优势很快就会消失。
flow control
这不是pros/cons的问题,一定是你想要的
why should co or await be used?
co
不应再使用,它已被标准 ES8 (ES2017) async
/await
取代(尚未发布,但仍然如此)。它可能仍然用作转译器目标(对于支持 ES6 但不支持 ES8 的环境),或者当它用于 promises 以外的其他东西时用于向后兼容(假设 co 支持更多类型的 "yieldables")。