Home  >  Q&A  >  body text

html5 - javascript 回调函数 入门问题

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

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

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

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

PHPzPHPz2654 days ago315

reply all(6)I'll reply

  • 阿神

    阿神2017-04-10 17:12:13

    先分析题主的这个方法:

    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!';
    }

    reply
    0
  • 黄舟

    黄舟2017-04-10 17:12:13

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

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 17:12:13

    之后,在连接建立时执行

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:12:13

    如果表达式的右边是一个可执行的方法或者函数都是先执行再进行赋值的,所以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);

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:12:13

    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得到实际执行记过后,将调用定义的回调函数~~~

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 17:12:13

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

    reply
    0
  • Cancelreply