开发者问题收集

Javascript(mongojs):在函数中返回一个值

2013-04-27
516

我正在使用 mongojs,我必须从 mongodb 中获取的对象中检索一个字段。 我不明白如何返回该字段:

  function retrieveVertById(id){

  var result = [];
  db.clusters.find({id: id}, function (err, clusters){
  if( err || !clusters) console.log("No cluster found");
  else clusters.forEach( function (cluster) {

    vert = cluster["vertices"];
    result.push(vert);
    console.log(result);


   });
 })
return result;
};

var a = retrieveVertById("001");
console.log(a);

'forEach' 中的打印打印了正确的值: (例如 [ [ [ 8, 2, 2 ], [ 2, 2, 5 ], [ 2, 2, 2 ], [ 5, 2, 2 ] ] ] ) 相反,循环外的打印显示一个空数组。 返回不起作用的原因是什么? 提前感谢您的帮助。

2个回答

我没有使用过 mongojs,但任何数据库查找几乎肯定都是异步的。这意味着您传递给 db.clusters.find 的函数不会立即运行,而是在异步调用从 mongo 返回时运行。不要从 retrieveVertById 返回值,而是尝试使用回调函数:

function retrieveVertById(id, successCallback) {

  db.clusters.find({
    id: id
  }, function (err, clusters) {
    if (err || !clusters) {
        console.log("No cluster found");
    } else {
        var result = [];
        clusters.forEach(function (cluster) {
            vert = cluster["vertices"];
            result.push(vert);
        });
        successCallback(result);
    }
  });
};

retrieveVertById("001", function(result) {
  console.log(result);
});
ljfranklin
2013-04-27

哦,我明白了...您应该记住,javascript 是异步语言

return result;

after forEach() 将不会从 forEach() 内部返回结果。您应该在解析最后一个值后发送结果。

var i = 0;
clusters.forEach( function (cluster) {
    vert = cluster["vertices"];
    result.push(vert);
    if (i >= clusters.length)
        return result;
    i++;
});
monkeyinsight
2013-04-27