Javascript回调函数返回空对象

时间:2013-03-30 21:01:09

标签: javascript asynchronous callback

我似乎无法正确获得此回调函数。

dispatch: function (query, callback) {
  var result = new Object() ;
  var qd = new queryDispatcher.init();
  var google = qd.callGoogle(query, function(a,b) {
    result.gdocs = a ; 
    result.gtotal = b ; 
  }) ;       

  var bing = qd.callBing(query, function(a,b) {
    result.bdocs = a ; 
    result.btotal = b ;            
  }) ; 

  var yahoo = qd.callYahoo(query, function(c,d) {
    result.ydocs = c ; 
    result.ytotal = d ; 
  }) ; 

  callback(result);
},

如您所见,调度查询并将结果附加到结果对象。但是,回调(结果)仍然将空对象返回到父函数,如下所示。

var results = meta.dispatch(query, 
  function(result) {
    console.log(result);
  });
});

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

重要的是要记住,使用异步方法,执行流程与代码流程不同。设置异步函数后,执行流将继续,但异步函数的结果可能尚未准备好。在这种情况下,当执行到达callback(result)时,由于没有任何异步函数完成,因此result对象上没有设置任何内容。所以你需要以某种方式链接你的异步函数。 “蛮力”(非平行)方法类似于:

qd.callGoogle(query, function(result1) {
    qd.callBing(query, function(result2) {
        qd.callYahoo(query, function(result3) {
             callback(combinedResult);
        });
    })
})

但我真的建议您查看一个流程库,例如node-seq如果您正在使用nodejs,或jQuery Deferred/Promise用于浏览器使用。

答案 1 :(得分:0)

您的回调是同步的,但是异步获取属性。当你调用callback时,你得到的只是一个空对象。

只有在你得到所有三个答案后才能调用回调(例如,使用计数器)。

dispatch: function(query, callback) {
  var result = new Object(),
      qd = new queryDispatcher.init(),
      counter = 3;

  var google = qd.callGoogle(query, function(a,b) {
    result.gdocs = a ; 
    result.gtotal = b ; 
    checkCallback();
  }) ;       

  var bing = qd.callBing(query, function(a,b) {
    result.bdocs = a ; 
    result.btotal = b ;   
    checkCallback();         
  }) ; 

  var yahoo = qd.callYahoo(query, function(c,d) {
    result.ydocs = c ; 
    result.ytotal = d ; 
    checkCallback();
  });

  function checkCallback() {
    if (--counter == 0) {
      callback(result);
    }
  }
}

但我宁愿选择promises而不是回调。这是一种强有力的方法。