Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 套接字io内部的回调_Javascript_Node.js_Sockets - Fatal编程技术网

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);})
是一个语法错误。为什么函数参数中的对象中有表达式?