2015-09-12 2 views
0

У меня возникла проблема с попыткой получить значение из запроса внутри async.forEachOf, который выполняется в зависимости от оператора if, поэтому я могу передать это значение в следующий шаг async.waterfallПолучение значения от async.forEachOf для перехода к следующему шагу async.waterfall

Вот код:

async.waterfall([ 
    function(callback) { 
     db.query('select id from topics where description = ?', 
      [topic], function(err, rows){ 
       callback(err, rows); 
      }); 
    }, 
    function(rows, callback) { 
     var query = rows[0].id 
     db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder', 
      [query], function(err, rows){ 
       callback(err, rows); 
      }); 
    }, 
    function(rows, callback){ 
     var callbackRows = rows; 
     async.forEachOf(callbackRows, function(row, key, callback){ 
      var topics 
      console.log('rows[key].id: ', callbackRows[key].id); 
      if (callbackRows[key].background == 0){ 
       var query = callbackRows[key].id 
       db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder', 
        [query], function(err, rows){ 
         callbackRows[key].subTopics = rows; 
         topics = callBackRows; 
         console.log('rows from async.forEach db query: ', rows); 
         console.log("from inside asnyc.foreach", callbackRows); 
         }); 
      } 
      callback(); 
     }, function(){ 
      callback(null, topics); 
      console.log('forEachOf callback called'); 
     }); 
     // console.log(topics); 
    } 
], function(err, topics){ 
    console.log("from end of waterfall: ", topics); 
}); 

Я пытался сделать это несколькими способами, и ошибка настоящее время я получаю то, что темы не определен в строке callback(null, topics) в async.forEachOf раздел

Слишком устал писать больше на данный момент, я ложился спать. Если это понадобится позже, я позабочусь об этом. Тем временем, что я пытаюсь сделать, это добавить результаты из запроса в конце async.forEachOf к элементу в массиве значения, возвращаемого предыдущим запросом. Оттуда я хочу отправить поместить это в объект ответа в выражении, в заключительном обратном вызове в async.waterfall.

ответ

0

В третьей части обратный вызов необходимо вызвать после завершения запроса данных, а также в else-части оператора if, чтобы убедиться, что он всегда вызывается ровно один раз.

if (callbackRows[key].background == 0){ 
    var query = callbackRows[key].id 
    db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder', 
     [query], function(err, rows){ 
      callbackRows[key].subTopics = rows; 
      topics = callBackRows; 
      console.log('rows from async.forEach db query: ', rows); 
      console.log("from inside asnyc.foreach", callbackRows); 
      callback(); 
      }); 
} else callback(); 
0

Темы не определены, поскольку они не определены ни в области этой функции, ни в области родительской функции. В вашем коде topics определен внутри функции итератора forEachOf. Решение состоит в том, чтобы просто определить темы в родительской функции, например.

function(rows, callback){ 
     var callbackRows = rows; 
     var topics; // move the definition to here 
     async.forEachOf(callbackRows, function(row, key, callback){ 
+0

Я все еще не определен с этим изменением – realisation

+0

Я получаю журнал консоли от завершающего обратного вызова до конца 'async.forEachOf'. Кроме того, когда я пытаюсь поставить триггер callback для 'async.forEachOf' в инструкции if, я не получаю console.log заключительного обратного вызова' async.waterfall'. – realisation

+0

У вас есть эта строка прямо здесь 'themes = callBackRows;', поставьте 'console.log ('themes', themes)' прямо после этой строки и посмотрите, имеет ли значение значение в конце выполнения forEachOf. –

0

topics Не требуется topics. Просто передайте rows в обратный вызов. то есть callback(null, rows);

+0

Вы прочитали код? Мне нужно передать данные в заключительный обратный вызов из второго обратного вызова в водопаде с данными из третьего запроса обратного вызова. – realisation

+0

Конечно, я прочитал код. Кажется, вы не понимаете, что переменные в JavaScript являются ссылками на объекты. В вашем третьем обратном вызове водопада 'rows',' callbackRows' и 'themes' все ссылаются на один и тот же объект. Просто измените 'callback (null, themes);' to callback (null, rows); 'и ваш код должен работать. – SpiderPig

+0

Подождите, я только что нашел вторую ошибку в вашем коде. Вызов обратного вызова, который после if должен находиться внутри обратного вызова db.query. Кроме того, это также должно быть в другой части сказанного if. – SpiderPig

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

  • Нет связанных вопросов^_^