这是使用NodeJS,SocketIO和&猫鼬。
客户端按钮正在触发服务器端'LoadF'套接字,它应该通过mongoose进行3次查询,并在套接字回调中发回结果。我正在尝试将每个Mongoose查询结果推送到一个数组,该数组将作为单个字符串化的JSON发回。
问题是.push没有填充'doc'数组。我认为这可能是一个范围问题,但我已经尝试了所有可以想到的组合,但没有结果。
代码(仅显示3个猫鼬查询中的1个):
socket.on('loadF', function(data,callback){
var doc = [];
console.log("before:" + toString(doc));
filldoc(function(err, assets){
if (err) return console.error(err);
console.log("during:" + assets);
doc.push(JSON.stringify(assets));
});
callback(doc.join(','));
console.log("after:" + doc[0]);
function filldoc(callback){
initCm.find({}, function(err, assets){
if (err) return callback(err, null);
callback(null, assets[0]);
});
}
});
这是我从日志中获得的输出没有错误:
before:[object Undefined]
after:undefined
during:{ _id: 54e4c934b61b8b6824ff38aa,
id: 'document',
version: '1.0',
__v: 0 }
'during'输出显示应该放入数组的内容。
不确定为什么''''在'之后'来临之后呢?无论我尝试什么,似乎总是如此。
答案 0 :(得分:0)
filldoc()
是异步的。这意味着您只能处理它在您提供的回调中创建的结果。这些代码行的当前位置:
callback(doc.join(','));
console.log("after:" + doc[0]);
将在filldoc完成其工作之前运行并调用其回调,因此doc
仍为空。相反,你需要像这样移动回调内部的那些:
socket.on('loadF', function(data,callback){
var doc = [];
console.log("before:" + toString(doc));
filldoc(function(err, assets){
if (err) return console.error(err);
console.log("during:" + assets);
doc.push(JSON.stringify(assets));
callback(doc.join(','));
console.log("after:" + doc[0]);
});
function filldoc(callback){
initCm.find({}, function(err, assets){
if (err) return callback(err, null);
callback(null, assets[0]);
});
}
});