2015-06-02 43 views
1

当执行数据需要很长的时间我有插座有问题。 例如:回调插座的内部IO

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的(输入)以执行,将的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); 
    }); 

}); 

而且我修改了富这样

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

但它仍然是一样的效果:插座仍在发射空。 对不起,如果这是一个天真的错误。 谢谢!

+0

可以修改'foo'添加一个回调函数? – azium

+0

你的意思是foo(input,callback)?当然,我会尝试。我实际上有一个for循环代替foo()。也许我可以移动所有的代码并编写一个新的函数。 – Emma

+0

你将不得不显示的代码为'富()'函数为我们更具体如何解决它的建议。如果它执行异步事件,那么它必须采取一个回调,当它完成时调用,或者返回一个在完成时解决的promise。这就是异步编程在nodejs中的工作方式。 – jfriend00

回答

2

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

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

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

UPDATE:不能使用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) 
     } 
     }); 
    }); 
    } 
} 

Promises are awesome though

+0

这很好!学到这么多!谢谢!! – Emma

1

您可以通过添加一个回调,以保证输出将执行什么富是做后emited重新定义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. 
    }); 

Learn more about callbacks

+1

'函数({的console.log( “这是结束”,输出); socket.emit( '结束' 输出);})'是语法错误。为什么在函数参数中的对象内部有表达式? – azium

+0

是的!对不起..我纠正它 –