javascript - callback inside of socket io -
i having problem socket when executing data takes long time. example:
socket.on('start', function(input){ var output = foo(input); //taking long time data, networking etc. console.log("this ending", output); socket.emit('end',output); });
it seems if takes long time foo(input) execute, nodejs emit output first while still null.
how can make sure finish executing first before emit?
i modified
socket.on('several',function(meteridarray){ console.log("i have receiever meteridarray",meteridarray); meterids = meteridarray.meterids; foo(meterids,function(datasets){ console.log("this datasets",datasets); socket.emit('datasets',datasets); }); });
and modified foo this
function foo(meterids,callback){ //this meant long call. var datasets = []; (var = meterids.length - 1; >= 0; i--) { datapoint.setmeterid(meterids[i],function(err, results){ datapoint.dorequest(null, function(err, results){ var dataafter = []; var step = 1; for(var = 0; < results.timeseries.length; = + step) { var item = results.timeseries[i]; for(date in item) { dataafter.push({x: date, y: item[date]}) } } console.log("this data after",dataafter); datasets.push(dataafter); }); }); } callback(datasets); }
but still same effect: socket still emitting null. sorry if naive bug. thanks!
if can modify foo
need this:
socket.on('start', function(input){ foo(input, function (output) { console.log("this ending", output) socket.emit('end', output) )) })
you need fire callback when server request returns.
update: can't use loop i
keep track of how many requests have been made, have keep track once request returns.
function foo(meterids, callback) { var datasets = []; var numberofrequeststomake = meterids.length; (var = meterids.length - 1; >= 0; i--) { datapoint.setmeterid(meterids[i],function(err, results){ datapoint.dorequest(null, function(err, results){ var dataafter = []; var step = 1; for(var = 0; < results.timeseries.length; = + step) { var item = results.timeseries[i]; for(var date in item) { dataafter.push({x: date, y: item[date]}) } } console.log("this data after",dataafter); datasets.push(dataafter); numberofrequeststomake--; // if final return server if (numberofrequeststomake === 0) { callback(datasets) } }); }); } }
Comments
Post a Comment