global.Promise = require('bluebird');
const co = Promise.coroutine;
const a = co(function* (abc) {
console.time(abc);
for (var i = 1; i < 10000; i++)
yield Promise.delay(0);
console.timeEnd(abc);
});
a('test1');
const b = async function(abc) {
console.time(abc);
for (var i = 1; i < 10000; i++)
await Promise.delay(0);
console.timeEnd(abc);
}
b('test2');
运行结果
test1: 13575.528ms
test2: 13819.517ms
速度基本一样,代码长度也基本一样,不过bluebird的corutine可以yield promise, 也可以yield generator function 没看出来 async await 的语法有什么优势?
- 原生 vs 第三方,可以少用一个库
- 一个是函数声明,一个是变量声明,前者语义更清晰一点,而且可以查询参数个数,不信你试试a.length跟b.length是不是一样 不过也可以用函数声明generator,不丢失参数信息,但是需要wrap一层
function*myGenerator(abc) {
console.time(abc);
for (var i = 1; i < 10000; i++)
yield Promise.delay(0);
console.timeEnd(abc);
}
console.log(myGenerator.length) // 输出1, 此时不丢失参数信息
var a = co(myGenerator) // 但是需要多一层wrap语法
所以co模拟的还是多了一层语法,只是你把他们写在一行了。。。。
不太了解你说的yield generator function是啥意思
很重要的2个因素是语义以及原生,从语义上来说
const a = co(function* (abc) { const b = async function(abc) {
这两行是完全不同的。 再者原生也是极大的优势,还记得left-pad的恐怖么
const _async = co.wrap;
const fn = _async(function * (arg) {
const x = yield Promise.resolve('x');
});
const fn2 = async (arg) => {
const x = await Promise.resolve('x');
};
有没有很像…
const _async = require('lei-coroutine').wrap;
const fn = _async(function* (a, b) {
const x = yield Promise.resolve(a + b);
return x;
});
@magicdawn 是的是的,但是还是语义,语义,哈哈哈
发现有一个优势是co这类类库没法比的,就是在报错的时候,如果存在多层async function的调用,最后出错的信息里会提供整个call stack,这样debug起来就极为方便,知道是执行了怎样的过程后出错了。co这种比较hacky的方式弄出来的异步,调试起来很麻烦,除非跟踪断点否则很难知道整个程序执行流程
现在node 7几乎完美了,除了那个import模块管理。不知7现在支不支持object的spread和class的static property,等7普及起来估计后端就加两三个简单的babel-plugin就能搞定了,用不到preset了
@andyhu 我也比较期待static property,不过,这个是es标准吗?