0

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

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);
  });
});

任何帮助将不胜感激!

4

2 回答 2

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用于浏览器。

于 2013-03-30T21:17:55.283 回答
0

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

您应该只在获得所有三个答案后才调用回调(例如,使用计数器)。

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);
    }
  }
}

但我宁愿选择承诺而不是回调。这是一种强大的方法。

于 2013-03-30T21:18:03.570 回答