2015-06-02 40 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

是的!對不起..我糾正它 –