async的一点疑惑
发布于 9 年前 作者 nichbar 4759 次预览 最后一次回复是 9 年前 来自 问答
我的目的是顺序执行a、b、c三个方法,因为b依赖方法a返回的数值,c又依赖b返回的数值。 我的代码是这样的
async.series([
function (callback) {
session = sessionUtils.getSession();
console.log('1');
callback(null, 'one');
},
function (callback) {
picUtils.downloadVC2(session);
console.log('2');
callback(null, 'two');
},
function (callback) {
read();
console.log('3');
callback(null, 'three');
}
],
function (err, results) {
if (err)console.log(err);
});
理论上来说不是应该输出
“数据库连接成功,获取session" 和 “1”,
”验证码下载成功“ 和“2”,
“请输入验证码”和”3“。
可是结果却是
这是为什么呢?
10 回复
用的不对吧,async.series 看api说明好像是”多个函数依次执行,之间没有数据交换“,应该用waterfall或者auto
你的需求应该用waterfall吧
@imhered waterfall 也是一样的情况,会不会是因为我方法1是一个request的网络请求里面又有一个回调造成的呢?
@nichbar 可以说是的,异步操作完成后再callback,另外异步操作的返回值通常是通过回调返回的,不能直接赋值。看你这个getSession很可能是一个异步操作吧,如果是,你这么写就是不对的。
@raymonife 是的,getSession是一个网络请求,在回调里把数据返回,那应该怎么修改使得网络请求结束返回值是个不是异步操作呢?
@nichbar 改成这样试试,不知道行不行。虽然不是完美的解决版本
@nichbar 一般有I/O就会是异步,我猜测你这段代码应该这么写吧。。。
感觉你并不理解异步,建议可以先了解异步,在不使用async的情况下写出正确的代码,再考虑使用async、promise之类的进行代码质量的改良。
@raymonife 好的,谢答疑
为嘛我到现在只用过waterfall parallel
7楼正解,而且这种情况确实应该使用waterfall而不是series