Node.js 7 的 async await 终于来了,不过怎么觉得没什么用?
发布于 7 年前 作者 andyhu 20689 次浏览 来自 问答
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 的语法有什么优势?

9 回复
  1. 原生 vs 第三方,可以少用一个库
  2. 一个是函数声明,一个是变量声明,前者语义更清晰一点,而且可以查询参数个数,不信你试试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的恐怖么

@rwing

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标准吗?

回到顶部