节点 js 数组仪表板
Node js array dashboard
我正在用节点 js 做我的应用程序的后端。在这种情况下,我正在尝试获取典型的仪表板,如 facebook、instagram、....
对于一个用户,我试图让他关注的用户在哪里。当我得到一系列关注的用户时,我发现他们拥有 "recetas"(一个用户可以拥有多个)。最后,我将所有这些 recetas 添加到一个数组中,但问题是我返回的是空的。
getDashboard = function (req, res) {
var myarray = new Array();
//myarray = [];
User.findById(req.params.id, function (err, user) {
if (!user) {
res.send(404, 'User not found');
}
else {
var a = user.following;
a.forEach(function (current_value) {
Receta.find({ "user_id": current_value._id }, function (err, recetas) {
if (!err) {
recetas.forEach(function (receta) {
myarray.push(receta);
}
} else {
console.log('Error: ' + err);
}
});
})
res.send(myarray);
}
});
};
由于 Receta.find 即 I/O.,res.send(myarray);
在 a.forEach
完成之前被调用
仅在循环结束并返回 recetas 时调用 res.send。
您正在处理一个常见的异步问题。 Receta.find
是异步的,它不是阻塞操作,因此 res.send
在所有 Receta.find
调用完成之前被调用。您可以通过使用 Promises 解决此问题,假设它们在您的 Node 版本中可用:
var a = user.following;
var promises = a.map(function(current_value) {
return new Promise(function(resolve, reject) {
Receta.find({"user_id":current_value._id}, function (err, recetas) {
if(!err) {
resolve(recetas);
} else {
reject(err);
}
});
});
});
Promise.all(promises).then(function(allData) {
res.send(allData);
}).catch(function(error) {
res.send(error);
});
这样的库
我正在用节点 js 做我的应用程序的后端。在这种情况下,我正在尝试获取典型的仪表板,如 facebook、instagram、.... 对于一个用户,我试图让他关注的用户在哪里。当我得到一系列关注的用户时,我发现他们拥有 "recetas"(一个用户可以拥有多个)。最后,我将所有这些 recetas 添加到一个数组中,但问题是我返回的是空的。
getDashboard = function (req, res) {
var myarray = new Array();
//myarray = [];
User.findById(req.params.id, function (err, user) {
if (!user) {
res.send(404, 'User not found');
}
else {
var a = user.following;
a.forEach(function (current_value) {
Receta.find({ "user_id": current_value._id }, function (err, recetas) {
if (!err) {
recetas.forEach(function (receta) {
myarray.push(receta);
}
} else {
console.log('Error: ' + err);
}
});
})
res.send(myarray);
}
});
};
res.send(myarray);
在 a.forEach
完成之前被调用
仅在循环结束并返回 recetas 时调用 res.send。
您正在处理一个常见的异步问题。 Receta.find
是异步的,它不是阻塞操作,因此 res.send
在所有 Receta.find
调用完成之前被调用。您可以通过使用 Promises 解决此问题,假设它们在您的 Node 版本中可用:
var a = user.following;
var promises = a.map(function(current_value) {
return new Promise(function(resolve, reject) {
Receta.find({"user_id":current_value._id}, function (err, recetas) {
if(!err) {
resolve(recetas);
} else {
reject(err);
}
});
});
});
Promise.all(promises).then(function(allData) {
res.send(allData);
}).catch(function(error) {
res.send(error);
});
这样的库