套接字io内的callback

当执行数据需要很长时间时,我遇到了socket问题。 例如:

socket.on('start', function(input){ var output = foo(input); //taking a very long time to get data, networking etc. console.log("this is ending", output); socket.emit('end',output); }); 

看来,如果执行foo(input)需要很长时间,nodejs实际上会首先发出输出,而它仍然是空的。

我怎样才能确保在排放之前先完成执行?

我这样修改

  socket.on('several',function(meterIDArray){ console.log("I have receiever meterIDArray",meterIDArray); meterIDs = meterIDArray.meterIDs; foo(meterIDs,function(Datasets){ console.log("This is datasets",Datasets); socket.emit('Datasets',Datasets); }); }); 

我像这样修改了我的foo

 function foo(meterIDs,callback){ //this is what I meant by a long call. var Datasets = []; for (var i = meterIDs.length - 1; i >= 0; i--) { datapoint.setMeterID(meterIDs[i],function(err, results){ datapoint.doRequest(null, function(err, results){ var dataAfter = []; var step = 1; for(var i = 0; i < results.timeseries.length; i = i + step) { var item = results.timeseries[i]; for(date in item) { dataAfter.push({x: date, y: item[date]}) } } console.log("This is data After",dataAfter); Datasets.push(dataAfter); }); }); } callback(Datasets); } 

但它仍然是一样的效果:套接字仍然发射null。 对不起,如果这是一个天真的错误。 谢谢!

如果你可以修改所有你需要的是这样的:

 socket.on('start', function(input){ foo(input, function (output) { console.log("this is ending", output) socket.emit('end', output) )) }) 

您需要在服务器请求返回时触发callback。

更新:不能使用for循环i跟踪有多less请求已经作出,必须跟踪一旦请求返回。

 function foo(meterIDs, callback) { var Datasets = []; var numberOfRequestsToMake = meterIDs.length; for (var i = meterIDs.length - 1; i >= 0; i--) { datapoint.setMeterID(meterIDs[i],function(err, results){ datapoint.doRequest(null, function(err, results){ var dataAfter = []; var step = 1; for(var i = 0; i < results.timeseries.length; i = i + step) { var item = results.timeseries[i]; for(var date in item) { dataAfter.push({x: date, y: item[date]}) } } console.log("This is data After",dataAfter); Datasets.push(dataAfter); numberOfRequestsToMake--; // if this is the final return from the server if (numberOfRequestsToMake === 0) { callback(Datasets) } }); }); } } 

承诺是真棒,但

你可以重新定义你的foo函数,通过添加一个callback来保证输出在执行foo之后被执行。

例如

  socket.on('start', function(input){ foo(input, function(output){ // This code will be executed after foo performs the main job console.log("this is ending", output); socket.emit('end',output); }); //taking a very long time to get data, networking etc. }); 

了解有关callback的更多信息