节点js数组仪表板

时间:2017-03-27 17:49:39

标签: javascript node.js backend

我用节点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);
    }
  });
};

2 个答案:

答案 0 :(得分:2)

您正在处理常见的异步问题。 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);
});

如果原生承诺不可用,您可以使用Qbluebird

等库

答案 1 :(得分:1)

由于Receta.find是I / O,因此在res.send(myarray);完成之前调用

a.forEach

仅在循环结束并返回recetas时调用res.send。

相关问题