关于回调函数问题
发布于 10 年前 作者 cnhonker07 3786 次浏览 最后一次编辑是 8 年前 来自 问答

//dbCon.js

  • var setUser = function () {
  • function callback() {
    
  •     sql.open(conn_str, function (err, conn) {
    
  •         if (err) {
    
  •             console.log("Error opening the connection!");
    
  •             return;
    
  •         }
    
  •         conn.queryRaw("SELECT Username,Password FROM Users", function (err, results) {
    
  •             if (err) {
    
  •                 console.log("Error running query!");
    
  •                 return;
    
  •             }
    
  •             for (var i = 0; i < results.rows.length; i++) {
    
  •                 console.log(results.rows[i][0].toString());
    
  •             }
    
  •             return results.rows[1][0].toString();
    
  •         });
    
  •     });
    
  • }
    
  • return callback();
    
  • }
  • exports.setUser = setUser;

//index.js

  • var users = require(’./dbCon.js’);
  • console.log(users.setUser());

// node index.js the result: return is unfined console.log is ok. 能看懂不。。。求教

11 回复

代码格式化挺重要的,咋就这么不钻业捏~眼睛不好,花呀~编辑框已经提供了常见的样式~

他使用了高阶函数,首先外面少了一层函数调用;其次,return的数据到不了外层调用,undefined…闭包、异步及回调原理不太清晰吧^ ^

@DevinXian 我也是要测试ajaxIm的demo 才搞一下这个。麻烦求教一下。

        for (var i = 0; i < results.rows.length; i++) {
            console.log(results.rows[i][0].toString());
        }

这有结果吗?

我把你的代码稍微改改,NodeJS菜鸟风格- -正好今天写完年终总结,有点时间~~ 首先是db.js:

var setUser = function (callback) {//callback回调,数据库访问是异步操作,直接return会悲剧
	sql.open(conn_str, function (err, conn) {
    	if (err) {
        	console.log("Error opening the connection!");
        	return callback(err);
    	}
    	conn.queryRaw("SELECT Username,Password FROM Users", function (err, results) {
        	if (err) {
            	console.log("Error running query!");
            	return callback(err);
        	}
        	for (var i = 0; i < results.rows.length; i++) {
            	console.log(results.rows[i][0].toString());
        	}
        	//return results.rows[1][0].toString();//这里return的是内层函数
        	callback(err, results);//使用回调获取数据,第一个参数表示异常
    	});
	});
};

exports.setUser = setUser;

index.js:

var User = require('./db.js');
User.setUser(function(err, data){
	//handle err...
	//handle data
});//此处传入一个函数作为回调获取结果	

@hades 有的。(忙在群里 没及时刷新)楼下的兄弟帮我解决了。thanku all the same

@DevinXian 谢谢。。我只想说 你们这年总结太及时了。虽然我没看懂。我研究研究 。。best wishes。

谢谢大家!

@cnhonker07 之前说少了一层调用说错了,代码中return callback()本身就调用了,我没看仔细,sorry,所以@hades 打印肯定会有的~

@DevinXian @.@其实我只是想说,他的回调没写,就你写的那句。

@hades 大哥啊。。你去看看我刚提问的一个问题。。跟这个不是差别很多。。。

回到顶部