當執行數據需要很長的時間我有插座有問題。 例如:回調插座的內部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);
}
但它仍然是一樣的效果:插座仍在發射空。 對不起,如果這是一個天真的錯誤。 謝謝!
可以修改'foo'添加一個回調函數? – azium
你的意思是foo(input,callback)?當然,我會嘗試。我實際上有一個for循環代替foo()。也許我可以移動所有的代碼並編寫一個新的函數。 – Emma
你將不得不顯示的代碼爲'富()'函數爲我們更具體如何解決它的建議。如果它執行異步事件,那麼它必須採取一個回調,當它完成時調用,或者返回一個在完成時解決的promise。這就是異步編程在nodejs中的工作方式。 – jfriend00