Javascript:将值返回给回调函数

时间:2015-04-24 16:07:27

标签: javascript node.js callback lodash

我有一个非常具体的问题,希望有人可以帮我一把。当谈到NodeJS时,对于Javascript来说,我非常环保。

我正在使用lodash的{​​{1}}功能来遍历并添加到数组内的对象中。整件事看起来像这样:

_.forIn

基本上它是db elasticsearch中保存的关键字列表。我试图找到一种方法来向这个对象添加这些关键字返回的结果数量的计数器。

此计数将来自我们用于搜索产品数据库的弹性搜索设置。

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

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

这是我现在的代码:

[ 
  { 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上获得正确的数据。

PS。 这不是我的实际代码,但它几乎是它的要点,所以可能会有一些拼写错误。

此外,list_datalist是我试图找出其工作原理的结果。我已经尝试过阅读JS回调的工作原理,但我所看到的似乎无法帮助解决我的问题。

1 个答案:

答案 0 :(得分:3)

只有在所有list_data完成后才能检查callbacks对象。

如果要验证get_count函数是否正常工作,可以在callback内移动console.log,这将导致控制台中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) } );
} 

为了做到这一点,我建议使用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);
    });
}