2015-07-13 4 views
0

В узле js я использую функцию async для получения результата от другой функции и сохраняю ее как массив и возвращаю результат. Но здесь я получаю пустой json как output {}. См. Комментарии внутри блока кода. Могу ли я узнать, где я ошибаюсь?nodejs async каждая функция

collectSearchResult: function (searchConfig, callback) { 
var searchResult = {}; 
async.each(searchConfig.scope, function (scope, callback) { 
    var query = { 
     "query": { 
      "match": { 
      "_all": searchConfig.q 
     } 
     }, 
    operationPath = scope.url; 

    this.doSearch(operationPath, query, function (err, results) { 
     var type = scope.type; 
     searchResult[type] = results; 

     // Here i am able to get correct output async 
     console.log(searchResult); 
    }); 

    callback(); 
    }.bind(this), function (err) { 

    // Here it is just returning empty json like {}. this function is called before this.doSearch complete its task 
    console.log(searchResult); 
    callback(err, searchResult); 
    }); 
} 
+0

Почему вы используете привязки повсюду? Что именно вы пытаетесь сделать с этой функцией? Похоже, вы просто хотите запустить запрос и вернуть результат в обратном вызове. – mmilleruva

+0

удалено ненужное связывание. searchConfig.scope - это массив конфигураций. Я вызываю асинхронно, чтобы получить данные из другой функции this.doSearch, которая помогает получать данные с сервера. –

+0

А вот функция doSearch: функция (operationPath, запрос, обратный вызов) { \t \t request.POST ({ \t \t \t URL: rootUrl + operationPath, \t \t \t заголовки: { \t \t \t \t «Содержание -Type ": "приложения/JSON", \t \t \t}, \t \t \t тела: JSON.stringify (запрос) \t \t}, функция (ошибка, отклик) { \t \t var searchResult = response.body; \t \t \t callback (err, searchResult); \t \t}); \t}, –

ответ

0
collectSearchResult: function (searchConfig, callback) { 
var searchResult = {}; 
async.each(searchConfig.scope, function (scope, callback) { 
var query = { 
    "query": { 
     "match": { 
     "_all": searchConfig.q 
    } 
    }, 
operationPath = scope.url; 

this.doSearch(operationPath, query, function (err, results) { 
    var type = scope.type; 
    searchResult[type] = results; 

    // Here i am able to get correct output async 
    console.log(searchResult); 
    //<><><><><><><> 
    callback(); //you need to place the callback for asynch.each 
    //within the callback chain of your query, else async.each 
    //immediately finishes before your data has arrived. 
    //<><><><><><><> 
}); 


}.bind(this), function (err) { 

// Here it is just returning empty json like {}. this function is called before this.doSearch complete its task 
console.log(searchResult); 
callback(err, searchResult); 
}); 
} 
+0

Спасибо большое, что он работает сейчас. –

Смежные вопросы