I can't seem to get this callback function right.
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);
},
As you can see, the query is dispatched and the results are being appended to the results object. However, the callback(result) is still returning an empty object to the parent function which is as follows.
var results = meta.dispatch(query,
function(result) {
console.log(result);
});
});
Any help will be greatly appreciated!
Answer
Your callback is synchronous, but the properties are asynchronously fetched. When you callback is called, all you got is indeed an empty object.
You should only call the callback after you have all the three answer (use a counter, for example).
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);
}
}
}
But I'd rather go with promises instead of callbacks. It's a powerful approach.
No comments:
Post a Comment