CNode

关于回调函数问题

问答
Ccnhonker07发布于12 年前最后回复12 年前11 回复4381 浏览0 收藏

//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)

D
DevinXian#1·12 年前

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

C
captainblue2013#2·12 年前

疑问在哪?

D
DevinXian#3·12 年前

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

H
hades#5·12 年前
        for (var i = 0; i < results.rows.length; i++) {
            console.log(results.rows[i][0].toString());
        }

这有结果吗?

D
DevinXian#6·12 年前

我把你的代码稍微改改,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
});//此处传入一个函数作为回调获取结果	
C
cnhonker07#7·12 年前
引用 hadesfor (var i = 0; i < results.rows.length; i++) { console.log(results.rows[i][0].toString()); } 这有...

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

C
cnhonker07#8·12 年前
引用 DevinXian我把你的代码稍微改改,NodeJS菜鸟风格 正好今天写完年终总结,有点时间 首先是db.js: var setUser = function (callback) {//callback回调,...

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

谢谢大家!

D
DevinXian#9·12 年前
引用 cnhonker07@hades 有的。(忙在群里 没及时刷新)楼下的兄弟帮我解决了。thanku all the same

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

C
cnhonker07#11·12 年前
引用 hades@DevinXian @.@其实我只是想说,他的回调没写,就你写的那句。

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

参与回复
登录后即可参与回复。登录