Javascript 套接字io内部的回调
当执行数据需要很长时间时,我的套接字有问题。 例如:Javascript 套接字io内部的回调,javascript,node.js,sockets,Javascript,Node.js,Sockets,当执行数据需要很长时间时,我的套接字有问题。 例如: 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)执行需要很长时间,nod
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实际上会在输出仍然为null时首先发出输出
如何确保在发出之前先完成执行
我改成这样
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);
}
函数foo(meterIDs,回调){
//这就是我所说的长途电话。
var数据集=[];
对于(变量i=meterIDs.length-1;i>=0;i--){
datapoint.setMeterID(meterIDs[i],函数(err,results){
datapoint.doRequest(null,函数(err,结果){
var dataAfter=[];
var阶跃=1;
对于(变量i=0;i
但效果仍然是一样的:套接字仍然发出null。
抱歉,如果这是一个幼稚的错误。
谢谢 如果您可以修改
foo
您只需要以下内容:
socket.on('start', function(input){
foo(input, function (output) {
console.log("this is ending", output)
socket.emit('end', output)
))
})
您需要在服务器请求返回时启动回调
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)
}
});
});
}
}
更新:不能使用for循环i
来跟踪发出了多少请求,必须在请求返回后跟踪
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(meterIDs,回调){
var数据集=[];
var numberOfRequestsToMake=米长度;
对于(变量i=meterIDs.length-1;i>=0;i--){
datapoint.setMeterID(meterIDs[i],函数(err,results){
datapoint.doRequest(null,函数(err,结果){
var dataAfter=[];
var阶跃=1;
对于(变量i=0;i
您可以通过添加回调来重新定义foo函数,以确保在执行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.
});
你能修改
foo
来添加回调函数吗?你是说foo(输入,回调)?当然,我会努力的。我实际上有一个for循环来代替foo()。也许我可以移动所有代码并编写一个新函数。您必须显示foo()
函数的代码,以便我们更具体地建议如何修复它。如果它执行异步操作,那么它必须要么接受完成时调用的回调,要么返回完成时解析的承诺。这就是异步编程在nodejs中的工作方式。问题在于回调的位置doRequest
大概就是异步执行某项操作的过程——“在事件循环之外”。将回调放在将某个内容推送到数据集的代码行之后。更新了my Answer还因为您在for循环中运行异步请求,您需要一种方法来跟踪返回的请求数量,以便知道何时启动回调。再次更新了我的答案函数({console.log(“this is ending”,output);socket.emit('end',output);})
是一个语法错误。为什么函数参数中的对象中有表达式?