2014-09-04 2 views
0

У меня возникла проблема с анонимным узлом js функций, хотелось узнать, как получить данные с асинхронных функций. Таким образом, он возвращает пустую Web API, потому что она возвращает до конца асинхронного вызывает SQLiteNodejs получить данные асинхронные функции

restapi.get('/data', function(req, res){ 
var array = []; 
    db.each("SELECT value FROM counts", function(err, row){ 
     array.push(row); 
    }); 

res.json(array); 
}); 

Может кто-нибудь объяснить мне, как это работает, и способ решить? Спасибо

ответ

2

В этом весь смысл асинхронного программирования с обратными вызовами. Функция async вместо возвращения результата принимает обратный вызов, который будет запускаться сразу после выполнения задания. Обратный вызов получит результат async-работы в качестве аргумента.

Не ожидайте, что функции async вернут что-либо. Вместо этого вложите логику обработки результатов в обратный вызов, который вы передаете этой функции.

Таким образом, ваш отрезала должен выглядеть примерно так:

restapi.get('/data', function(req, res){ 
    var array = []; 

    db.each("SELECT value FROM counts", function(err, row) { 
     if (row) { 
      array.push(row); 
     } 
     else { 
      res.json(array); // When there are no more rows 
     } 
    }); 
}); 

Работа с плоскими обратных вызовов является довольно боль. Это бесконечное гнездование, как правило, сильно загромождает ваш код. Вы можете помочь себе, если вы назвали свои обратные вызовы, и используйте именованные версии вместо вложенности. Это достанется вам до сих пор. Лучшим решением является использование библиотеки потока управления, например async. Однако для того, чтобы это работать, все обратные вызовы должны быть составными, т. Е. Следовать соглашению о принятии объекта ошибки в качестве первого аргумента. См. Например, this explaination.

+0

Спасибо за ответ и разъяснение, могли бы показать мне пример, чтобы лучше понять? – user2726677

+0

Просто подтвердил ответ. Добавим еще один полезный бит. –

+0

Очень спасибо, Иван! – user2726677

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