套接字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的更多信息