async的一点疑惑
发布于 9 年前 作者 nichbar 3946 次浏览 最后一次编辑是 8 年前 来自 问答

我的目的是顺序执行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“。 可是结果却是 x.png 这是为什么呢?

10 回复

用的不对吧,async.series 看api说明好像是”多个函数依次执行,之间没有数据交换“,应该用waterfall或者auto

你的需求应该用waterfall吧

@imhered waterfall 也是一样的情况,会不会是因为我方法1是一个request的网络请求里面又有一个回调造成的呢?

@nichbar 可以说是的,异步操作完成后再callback,另外异步操作的返回值通常是通过回调返回的,不能直接赋值。看你这个getSession很可能是一个异步操作吧,如果是,你这么写就是不对的。

@raymonife 是的,getSession是一个网络请求,在回调里把数据返回,那应该怎么修改使得网络请求结束返回值是个不是异步操作呢?

@nichbar 改成这样试试,不知道行不行。虽然不是完美的解决版本

function (callback) {
            session = sessionUtils.getSession(functin(error,reply){
			 	console.log('1');
            	callback(null, 'one');
			});           
        },

@nichbar 一般有I/O就会是异步,我猜测你这段代码应该这么写吧。。。

function (callback) {
	sessionUtils.getSession(function(error, session){
		console.log("1");
		if(error == null) {
			callback(null, session);
		}else{
			callback(error, null);
		}
	});
}

感觉你并不理解异步,建议可以先了解异步,在不使用async的情况下写出正确的代码,再考虑使用async、promise之类的进行代码质量的改良。

@raymonife 好的,谢答疑

为嘛我到现在只用过waterfall parallel

7楼正解,而且这种情况确实应该使用waterfall而不是series

回到顶部