关于异步流程控制 callback, promise, yield, async&await
发布于 7 年前 作者 ouyangxuanyun 4401 次浏览 来自 问答

更改接触Nodejs的时候一直用callback搭配第三方async模块,感觉稳定可靠。后来就一直用promise感觉写的比callback优雅一些,而且流程清楚一些并且promise.all等方法也可以代替之前的async模块解决流程问题。最近接触async/await 感觉挺方便代码也更清晰。同事有用yield配合co的,有用promise的,请问大家都用什么方式解决异步流程问题呢? 各有什么优势和劣势吗?

14 回复

只有nodejs才有这样五花八门的写法,其他语言都是一行一行写代码

看到楼上的说法,有点小乐,+1… 同步的写法是趋势,折腾了一圈各种写法之后,你会得出“一行一行”写代码的结论…

哈哈哈哈 大道至简,朴素的话语蕴含着深刻的道理

@yakczh

Python 的 yield 语法加入是在 2002 年, async / await 加入是 2015 年。 Ruby 也有 yield ,不过功能好像有差异。

  • callback 是最普通的。
  • promise 是包装的 callback ,本身没什么变化,还是异步回调形式。
  • yield 是语法层面的“进步”,能真正实现把异步形式改成同步形式。而且,可以只改上层调度,下层定义还是 callback 没关系。并且,它本身并不是针对“异步”的,本质是执行上下文的控制与切换,简单来说,它允许你在执行过程中暂时跳出来,之后,再回去。用处也不光在异步场景的写法上。
  • async / await 也是语法的改变,我觉得它影响太大,上层调度和下层定义都要改。下层的写法更改是代价,好处是写出来会比 yield “干净”点, yield 在调度那层需要套一个“壳”。

语法兼容性层面没有问题的话,自己写的话 async / await 就好。但是别人已有代码不一定是这样的, yield 直接对接 callback 和 promise 都没有问题。

es6 的 async/await 处理简单的异步问题配合promise已经是相当好用了。 async/await 主要的问题就是不支持await的库,或者使用callback的库,需要手动包装一下。 另外遇到复杂一点的需求比如按顺序,或者并发数限制,也需要写一个包装。

yield和generator用的少,不过本质来说都差不多,目前当然是async/await写起来最方便。

async函数也不是万能的。有的时候异步处理的函数需要由另一个库去调用,返回一个Promise是比较好用的做法

  const exampleFunction = async() => {
	  let result = await new Promise(rs => {
		  lib.someQuery((err, results) => {
			  // handle err
			  rs(results)
		  })	
	  })
	  // process result
  }

我现在主要用Async库,各种异步方法都有,方便好用。

主要使用Async库+callBack 。其他语法糖感怪怪的,不接受异步编程,为啥要使用node PHP和JAVA不更好写么!~

@yszou 总结的真好 感觉async/await 和promise 一起用也可以 yield感觉有点麻烦

@noe132 赞同! 例子不错哈

@yinsu aysnc库确实不错,不过感觉promise大多数场景也够用了

@beiyio 其实语法糖一方面为了代码易读性一方面也加入了一些封装方便使用,感觉单纯callback写出来的代码有点乱乱的感觉

async / await 有传染性,不管是被调用的模块还是调用的模块,都要重新包装一下,代码量相比cb要多出来些,另外要求运行版本也要比较高

async/await看起来要更接近同步些,而promise是让异步代码变得更优雅,使用起来看个人喜好了吧

回到顶部