【问题标题】:Javascript (mongojs): Return a value in a functionJavascript(mongojs):在函数中返回一个值
【发布时间】:2013-04-27 15:29:37
【问题描述】:

我正在使用 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' 中的 print 打印出正确的值: (例如 [ [ [ 8, 2, 2 ], [ 2, 2, 5 ], [ 2, 2, 2 ], [ 5, 2, 2 ] ] ) 相反,循环外的打印显示一个空数组。 什么不适用于退货? 提前感谢您的帮助。

【问题讨论】:

  • console.log(vert) 可以吗?
  • 是的,forEach 中的 console.log(vert) 也会打印正确的值。
  • 您能否更好地解释您的问题?打印是指console.log吗?哪个console.log 没有显示正确的值,areturn result, did you make your own id` 还是您误认为_id
  • 您不能从函数返回像find 这样的异步操作的结果。您必须使用回调,因为您的 retrieveVertById 函数在 find 回调发生之前返回。对现有问题进行一些搜索,因为这是一个非常常见的混淆点。
  • 对于打印,我的意思是指令'console.log'。正确的值仅在 forEach 中显示。 'return' 似乎没有效果,因为指令 'console.log(a)' 显示一个空数组,而不是显示正确值的指令 'console.log(result)'。

标签: javascript function mongodb return mongojs


【解决方案1】:

我没有使用过 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);
});

【讨论】:

  • 我能够通过回调获得该领域非常感谢您的宝贵时间!
  • 当我在示例底部调用retrieveVertById 时,我将回调作为匿名函数传递。我给retrieveVertById 提供了第二个参数,称为successCallback。所以successCallback(result); 行实际上调用了匿名函数:function(result) { console.log(result); },这是我作为参数传入的。编写异步程序时必须了解回调函数。
  • @FrancescoMaglia - 很高兴为您提供帮助!请务必标记一个已接受的答案以结束此问题。
  • 最后一个问题:如何将返回值赋给变量?我解释得更好:我想做这样的事情:var vert = retriveVertById("001")
  • @FrancescoMaglia - 简短的回答:将引用该变量的代码移动到回调的主体中。所以function(result) { console.log(result); } 变成了function(result) { var vert = result; //rest of your code }。长答案:对 JavaScript 回调函数做一些研究。在评论框中肯定有太多内容要涵盖。
【解决方案2】:

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

return result;

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

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

【讨论】:

  • 几个问题。由于此示例中有多个嵌套函数,因此 forEach 主体中的 return 语句不会“冒泡”并充当 retrieveVertById 函数的 return。其次,如果db.cluster.find方法如你所说是异步的,那么如果不使用回调函数,你就不能从中返回任何值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 2020-05-04
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多