CNode

Node.js 7 的 async await 终于来了,不过怎么觉得没什么用?

问答
Aandyhu发布于10 年前最后回复10 年前9 回复22431 浏览0 收藏
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)

Q
qingfeng#1·10 年前
  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是啥意思

R
rwing#2·10 年前

很重要的2个因素是语义以及原生,从语义上来说

const a = co(function* (abc) { const b = async function(abc) {

这两行是完全不同的。 再者原生也是极大的优势,还记得left-pad的恐怖么

A
andyhu#3·10 年前

发现有一个优势是co这类类库没法比的,就是在报错的时候,如果存在多层async function的调用,最后出错的信息里会提供整个call stack,这样debug起来就极为方便,知道是执行了怎样的过程后出错了。co这种比较hacky的方式弄出来的异步,调试起来很麻烦,除非跟踪断点否则很难知道整个程序执行流程

A
andyhu#4·10 年前

现在node 7几乎完美了,除了那个import模块管理。不知7现在支不支持object的spread和class的static property,等7普及起来估计后端就加两三个简单的babel-plugin就能搞定了,用不到preset了

M
magicdawn#6·10 年前
引用 rwing很重要的2个因素是语义以及原生,从语义上来说 const a = co(function (abc) { const b = async function(abc) { 这两行是完全不同的。 ...

@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');
};

有没有很像...

L
leizongmin#7·10 年前
const _async = require('lei-coroutine').wrap;

const fn = _async(function* (a, b) {
  const x = yield Promise.resolve(a + b);
  return x;
});
R
rwing#8·10 年前
引用 magicdawn@rwing 有没有很像...

@magicdawn 是的是的,但是还是语义,语义,哈哈哈

参与回复
登录后即可参与回复。登录