素材牛VIP会员
javascript 回调函数 入门问题
 风***人  分类:Node.js  人气:1039  回帖:6  发布于6年前 收藏
var get = function(cb){
    var db = mongoose.connect(uri,function(){
            cb(db);
    })
}

为什么cb可以取到 connect的返回值? cb不是在connect里面吗?

cb是在connect return后执行?还是之前执行的?

如果是之前执行,那怎么取到db?因为还没return。

讨论这个帖子(6)垃圾回帖将一律封号处理……

Lv1 新人
陌***人 PHP开发工程师 6年前#1

之后,在连接建立时执行

Lv6 码匠
lk***29 CEO 6年前#2

如果表达式的右边是一个可执行的方法或者函数都是先执行再进行赋值的,所以cb不可能取得db的值,你并没有贴出connect方法的具体context。如果connect方法的回调函数可以取得db的值,有一种可能是延迟执行的。就像这样:

function Obj(){
    this.connect=function(a,b){
      setTimeout(function(){b()},1000);
      return a;
    }
};
var uri="your name";
var mongoose=new Obj();
function cb(c){
    console.log(c);
    return c;
}
var get=function(cb){
var db=mongoose.connect(uri,function(){cb(db)})
    console.log(db);
}
get(cb);
Lv1 新人
陌***人 PHP开发工程师 6年前#3
var get = function(cb){
    var db = mongoose.connect(uri,function(){
            cb(db);
    })
}

get函数体中,
首先声明了一个变量db,然后mongoose.connect方法被执行,做为同步代码执行完成后返回一个值赋值给db变量,然后get函数返回。
但是因为connnet作为一个异步方法,运行的实际结果反映在connet方法绑定的回调函数中,回调函数定义涉及到一个闭包作用域的问题,这个回到函数将绑定get函数体中定义的变量db;那么当get函数执行返回后,db变量不会被释放掉。

当connect回调发生时,也就是connet得到实际执行记过后,将调用定义的回调函数~~~

Lv5 码农
星***屋 产品经理 6年前#4

之后
回调的意思就是操作完成后,将结果传入回调函数并执行。
在这段代码中,先会执行connect,操作完成后执行function(){cb(db);}

Lv5 码农
错***7 Linux系统工程师 6年前#5

db 与 cb 都在 get函数作用域中,
所以 cb(db)是有效的.

Lv3 码奴
馨***2 移动开发工程师 6年前#6

先分析题主的这个方法:

var get = function(cb){
    var db = mongoose.connect(uri,function(){
            cb(db);
    })
}

mongoose.connect的结果要赋给db, 所以这个函数里一定会有个return。
但是我们知道return执行之后函数执行就会停止。

如果这个回调,也就是:

function(){
    cb(db);
}

是在return前调用,那么执行cb(db)时,db尚未获取return的结果。
如果在return后调用, 那么就根本不会执行。

当然上面的推论都是在函数顺序执行的前提下。
所以这里是另一种情况:
就是这个函数虽然在return前调用,但是其执行时db已有return了的结果。
也就是说,这个函数是异步调用的。

假设mongoose.connect是这样的一个函数,那么就可以在自身return之后,获取自身的值。

mongoose.connect = function(uri,callback){
  setTimeout(function(){
    callback && callback()
  },0) ;
  return 'db connect succeed!';
}
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取