Javascript:将值返回给回调函数外部的变量[重复]

2024-03-29

我有一个非常具体的问题,希望有人可以帮助我。我对 Javascript 很陌生,对 NodeJS 则更陌生。

我在用lodash's _.forIn遍历并添加到数组内的对象的功能。整个事情看起来是这样的:

[ 
  { id: 20,
    keywords: 'shirts'
  },
  { id: 18,
    keywords: 'shoes'
  } 
]

基本上它是保存在弹性搜索数据库中的关键字列表。我正在尝试找到一种方法来向该对象添加这些关键字将返回的结果数量的计数器。

该计数将来自我们用来搜索产品数据库的 Elasticsearch 设置。

我想要得到的输出是这样的:

[ 
  { id: 20,
    keywords: 'shirts',
    count: 4
  },
  { id: 18,
    keywords: 'shoes',
    count: 15
  } 
]

这是我现在的代码:

function get_list( data ) {

  var list_data = data;
  var list = _.forIn( data, function( item, n, list_data ) {
    get_count( item, function( count_number ) {
      list_data[n].count = count_number;
    })
  });
  console.log( list, list_data );
}

function get_count( item, callback ) {

  var query = { // elasticsearch query here };  

  // elasticsearch query here, that returns the count in a callback
  es.count( query, function(count_number) { callback(count_number) } );
} 

当我运行它时,控制台将显示未更改的数组。我已经检查了每个函数的所有返回数据,一切都检查完毕。我似乎无法获得正确的数据list nor list_data.

附言。 这不是我的实际代码,但它几乎是其要点,因此可能存在一些拼写错误。

Also, list and list_data这是我试图弄清楚它是如何工作的结果。我尝试阅读 JS 回调的工作原理,但我所看到的似乎都无法帮助我解决问题。


您可以检查list_data仅在所有之后才对象callbacks完成了。

如果您想验证您的get_count功能正在工作,您可以将 console.log 移至callback,这将导致多个日志list_data在控制台中。

function get_list( data ) {

  var list_data = data;
  var list = _.forIn( data, function( item, n, list_data ) {
    get_count( item, function( count_number ) {
      list_data[n].count = count_number;
      console.log( list, list_data );
    })
  });

}

function get_count( item, callback ) {

  var query = { // elasticsearch query here };  

  // elasticsearch query here, that returns the count in a callback
  es.count( query, function(count_number) { callback(count_number) } );
} 

为了做到这一点,我建议使用asyncmodule with 非常适合处理像您这样的异步调用。

这是模块链接,因此您可以开始使用它:https://github.com/caolan/async https://github.com/caolan/async

这是我将如何实施async在我们的例子中模块:

var async = require('async');

function get_list(data) {

    var list_data = data;
    //Transform all the list_data objects adding the count prop.
    async.map(list_data, get_count, function(err, results) {
        console.log(results);
    });
}

function get_count(item, callback) {
    var query = { // elasticsearch query here 
    };
    // elasticsearch query here, that returns the count in a callback
    es.count(query, function(count_number) {
        //add the new prop to the item
        item.count = count_number;
        //return the transformed object
        callback(null, item);
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript:将值返回给回调函数外部的变量[重复] 的相关文章

随机推荐