环境Node.js + wilddog
这个问题困扰了我好几天
问题:node.js环境,多个节点嵌套查询如何能同步获得数据返回前端?
如下示例因为异步原因,某些数据无法及时获得
例如:存在images(图片信息)、like(图片赞数)、user(用户信息)三个节点:
//查询所有图片信息:
ref.child("images").on("value",funciton(snap){
var imgUrl,imgUid,userName,userAvator,numLike=0;
var datas = [];
if(snap.val()!=null)
//循环查询图片详细信息
var i = 0;
snap.forEach(function(snapshot){
imgUid = snapshot.val().uid;
imgUrl = snapshot.val().imgUrl;
imgId = snapshot.key();
//获取图片的用户信息(异步)
ref.child("users").child(imgUid).on("value",function(uinfo){
userName = uinfo.val().userName;
userAvator = uinfo.val().userAvator;
})
//获取图片的赞信息(异步)
ref.child("like").child(imgId).on("value",function(likeinfo){
if (likeinfo.val()!=null)
numLike = likeinfo.numChildren();
})
datas[i] = {
'imgUid':imgUid,
'imgUrl':imgUrl,
'imgId':imgId,
'userName':userName,<span style="font-family: Arial, Helvetica, sans-serif;">//无法确切获得</span>
'userAvator':userAvator,<span style="font-family: Arial, Helvetica, sans-serif;">//无法确切获得</span>
'numLike':numLike //无法确切获得
}
i++;
})
//Node.js 返回前端:
res.send(datas);
})
以上,因为异步处理而且嵌套、循环查询,我们无法确切获得datas数组返回的值,很有可能返回的值是不完整的。
解决办法,使用setInterval,每隔一秒执行一次?貌似可行。
最佳解决办法,重新构造数据结构,做一些必要的数据冗余:把图片的用户基本信息和点赞数写入images节点,那么我们查询的时候只需要一次性查询一个节点即可(配合Promise)。见Wilddog Promise化