Dav*_*vid 4 javascript node.js co babeljs ecmascript-2017
我不太明白这段代码之间的区别:
co(function *() {
const val = yield aPromise();
return val;
})
.then((val) => doSomethingWith(val), (err) => doSomethingWith(err));
Run Code Online (Sandbox Code Playgroud)
还有这个:
async function () {
try {
const val = await aPromise();
doSomethingWith(val);
} catch (err) {
doSomethingWith(err);
}
}
Run Code Online (Sandbox Code Playgroud)
浏览器或服务器(node.js)中使用的每个代码的优缺点(主要在性能,可读性和流程控制方面)是什么,为什么要使用 co(取决于co 外部库)或 await(这是还不是 ES7 的一部分,取决于babel-polyfill ) 的使用。
您显示的示例代码有两个主要区别:
doSomethingWith,看看和之间.then(…).catch(…).then(…, …)的区别。现在,我认为你真正想要比较的是
var example = co.wrap(function *() {
try {
const val = yield aPromise();
doSomethingWith(val);
} catch (err) {
doSomethingWith(err);
}
})
Run Code Online (Sandbox Code Playgroud)
和
async function example() {
try {
const val = await aPromise();
doSomethingWith(val);
} catch (err) {
doSomethingWith(err);
}
}
Run Code Online (Sandbox Code Playgroud)
并且可能
function example() {
return aPromise().then(doSomethingWith).catch(doSomethingWith);
}
Run Code Online (Sandbox Code Playgroud)
(如果aPromise同步抛出,最后一个实际上有不同的行为,这当然不应该这样做)
所以让我们讨论
表现
不要紧。真的不。虽然第三个可能是最快的,因为它创建的承诺量最少,而另外两个在引擎中还没有得到很好的优化。
可读性
选择自己。前两个几乎是等价的,但co有点难看(滥用生成器语法)。第三个非常简洁,因此可能会受到青睐,尽管对于复杂的控制流,这种优势很快就会消失。
流量控制
这不是利弊的问题,它必须是你想要的。
为什么要使用 co 或 await ?
co不应再使用,它已被标准 ES8 (ES2017) async/ await(尚未发布,但仍然存在)取代。当它与 promise 以外的其他东西一起使用时,它仍可能用作转译器目标(对于支持 ES6 但不支持 ES8 的环境)或向后兼容(假设 co 支持更多类型的“yieldables”)。
| 归档时间: |
|
| 查看次数: |
1394 次 |
| 最近记录: |