socket内部的回调函数
callback inside of socket 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(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.
});
了解更多关于回调的信息
相关文章:
- 如何将一个JavaScript函数回调为多个函数
- Meteor:异步函数回调异常:onAfterAction
- 从类方法中的 ajax post 函数回调函数更改 javascript 类属性
- jQuery动画函数回调错误
- jquery在html属性中添加函数回调,以便在其他事件中调用
- jquery getjson 函数:回调返回错误的字符串
- postMessage - 多个 postMessage 事件/函数/回调
- 在 Promise 调用的错误函数回调后附加对象的用法是什么
- 单击事件后的 JavaScript 函数回调
- 设置超时函数回调静态变量
- Jquery UI 模式匿名函数回调以打开对话框
- 函数回调、局部变量和 chrome.storage.sync.get
- Jquery Ajax 没有拾取选项参数中指定的函数回调
- 如何在 javascript 中进行函数回调
- 用函数回调封装JavaScript
- jQuery JavaScript嵌套异步函数回调
- Node.js-匿名函数回调
- 函数回调超出范围
- php代码的Javascript函数回调
- 如何使用函数回调在更改时提交表单