socket内部的回调函数

callback inside of socket io

本文关键字:函数 回调 内部 socket      更新时间:2023-09-26

当执行数据需要很长时间时,我有一个套接字问题。例如:

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实际上会先发出输出,而它仍然是空的。

如何确保在emit之前先完成执行?

我这样修改

    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);
}

但是它仍然是相同的效果:socket仍然发出null。抱歉,如果这是一个幼稚的错误。谢谢!

如果你可以修改foo,你只需要这样做:

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

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

更新:不能使用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函数,以保证在执行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.
    });

了解更多关于回调的信息