第一次写 node.js , 调用 async. waterfall 里进行 mysql 嵌套循环查询, callback is not a function,有偿咨询……

2018-04-05 00:45:34 +08:00
 Rorysky

总是提示 callback is not a function …… 难道回调格式错了?

主要想实现的逻辑是 操作 mysql 数据库,以第一次查询的结果为条件进行第二次查询,以第二次查询结果为条件进行第三次查询。

 promobonus= function (eigencode, callback){
	async.waterfall([  
		    function(eigencode,callback){
			    pool.query(sql+"promocode = ?",[eigencode+''],function(err,subresult1){
				    	if(err || subresult1.length<1){
		                err='sql first level quering erro or result is null';
		                } else {
		                
		            };
		            console.log('1 '+typeof(callback));
			    		callback(err,subresult1);	  
				});
		    },function(subresult1,callback) {
		    	var sqlele=[],eigenele=[];
		    	for(var x of subresult1){
		    		sqlele.push("promocode= ? OR");
		    		eigenele.push(x.eigencode);
		    	};
		    	var sqltmp=sqlele.join(' ');
		    	var sqlnew=sql+sqltmp.substring(0,sqltmp.length-2);

		    	pool.query(sqlnew,[eigenele+''],function(err,subresult2){
		    		  if(err || subresult2.length<1){
		                err='sql second level quering erro or result is null';
		                } else {
		              
		          };
		          console.log('2 '+typeof(callback));
		          callback(err,subresult2);	    	
		    });
		    },function(subresult2,callback){
		    	var sqlele2=[],eigenele2=[];
		    	for(var y of subresult2){
		    		sqlele2.push("promocode= ? OR");
		    		eigenele2.push(y.eigencode);
		    	};
		    	var sqltmp2=sqlele2.join(' ');
		    	var sqlnew2=sql+sqltmp2.substring(0,sqltmp2.length-2);

		    	pool.query(sqlnew2,[eigenele2+''],function(err,subresult3){
		    		if(err || subresult3.length<1){
		                err='sql third level quering erro or result is null';
		                } else {
		       
		          };
		          console.log('3 '+typeof(callback));
		          callback(err,subresult3);	    	
		    });
		    }
	    ], function (err,subresult3) {  
	    	if(err) {
	    		console.log(err);
	    	}
	    	console.log('4 '+typeof(callback));
	    	callback(err,subresult3);
	    });
};
5338 次点击
所在节点    Node.js
10 条回复
helloworld12
2018-04-05 01:09:14 +08:00
用 es6 的 async 和 await 啊 ,不要用这个
wotemelon
2018-04-05 01:38:13 +08:00
纠正楼上,async await 属于 es7.
升级 nodejs 到 8 LTS 以上,支持 async await 写法,谁写谁怀孕
dd0754
2018-04-05 01:52:16 +08:00
干嘛不用 async/await,这个看着就蛋疼...

第一个函数
function(eigencode,callback)
改成
function(callback)
noe132
2018-04-05 02:33:48 +08:00
还有空格 tab 混用。。。
dingtian
2018-04-05 03:43:23 +08:00
其实 es6 的 Promise 也可以了解一下。。。
Rorysky
2018-04-05 09:44:28 +08:00
@dd0754 感谢!不报错了; 其实一开始只看了 js 基本语法,第一个版本是用回调嵌套写的…… 感觉写出来简直 shit 一样,改成这个 waterfall 流程控制了……

再请教一下 为什么把第一个参数 eigencode 去掉就可以了。
vcfvct
2018-04-05 10:40:48 +08:00
都 2018 了,还是直接用 asycn await 吧。。。
Cbdy
2018-04-05 12:08:08 +08:00
@wotemelon 纠正一下,async,await 似乎属于 es2017
whypool
2018-04-05 13:40:14 +08:00
数据库查询,逻辑控制,分开写
数据表查询返回一个 promise,调用直接 await 就行,不用回调
zgk
2018-04-05 20:15:41 +08:00
写了个楼上提到的 Promise 和 async/await 的示例,希望可以带来帮助

```
// 把回调包装成 Promise
function run(sql, params) {
return new Promise(function (resolve, reject) {
pool.query(sql, params, function (err, data) {
if (err) return reject(err);
resolve(data);
});
})
}

// Promise 方式执行
run('SELECT * FROM .....')
.then(function (data) {
// 第一次查询以后
return run('SELECT * FROM ....', data.xxx);
})
.then(function (data) {
// 第二次查询以后
return run('SELECT * FROM ....', data.yyy);
})
.then(function (data) {
// 第三次查询以后
})
.catch(function (error) {
// 错误情况
console.log(error);
});

// async/await 方式
async function runAsync() {
try {
let result1 = await run('SELECT * FROM ....');
let result2 = await run('SELECT * FROM .... WHERE a = ?', result1.xxx);
let result3 = await run('SELECT * FROM .... WHERE a = ?', result2.yyy);
} catch (error) {
console.log(error);
}
}

runAsync();

```

个人感觉 Promise 的形式假如有中间需要跳出的逻辑的话,手动构造一堆 Promise.resolve() 然后还好多 if 判断不太方便,async/await 舒服多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444422

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX