firemail

标题: js经典异步协同问题 [打印本页]

作者: jimu    时间: 2016-3-30 01:01
标题: js经典异步协同问题
or循环调用了异步程序,需要等待循环结束继续执行,如何确定异步事件全部结束?
我现在想到的办法是记下循环的次数,每当异步程序结束时,计数减一,当等于零的时候执行后面的程序,但是感觉这样写的代码好丑,有没有更好的办法?


不觉得使用计数器有任何丑陋之处 可以参考jquery的when 这个方法就使用了计数器来监控并发异步任务的结束时刻

对于串行执行的异步任务 可以使用队列或者promise的高级实现版本 参见jquery queue模块 jquery deferred模块的pipe方法和深入浅出nodejs的第四章提到的可以返回promise对象的then方法

可以用Promise.all()

1. Continuation-passing style
2. js 是动态类型语言,所以你可以方便的把临时状态绑定到作用域所能够访问的任意对象上


你这问题是js经典的异步协同问题。
你用的是计数器方法。
目前通用的解决方法是promise和generator。
可以查下相关资料。
另,朴灵的深入浅出nodejs里有个章节也讲到这个。
async 或是 eventproxy


计数器可以是可以,但是不太fool proof (例如 error了或是中间crash了怎么办?还得做处理)
用上面提到的promise或是(个人偏好)async caolan/async · GitHub
都是好很多的作法

你的情况就可以用类似下面这种来做control flowasync.each(array, do(callback){  // do something and callback when finished/error},function(){  // handle error or do something when all finished});








欢迎光临 firemail (http://firemail.wang:8088/) Powered by Discuz! X3