我似乎无法正确获得此回调函数。
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);
});
});
任何帮助将不胜感激!
答案 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而不是回调。这是一种强有力的方法。