2015-09-12 49 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

在第三部分中,回調需要在數據查詢完成後調用,但也在if語句的else部分中確保總是隻調用一次。

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'的'年底之前。另外,當我嘗試將'async.forEachOf'的回調觸發器放在if語句中時,我沒有得到'async.waterfall'結尾回調的console.log。 – realisation

+0

你有這條線在這裏'topics = callBackRows;',把'console.log('topics',topics)'放在那行之後,看它是否在forEachOf執行結束時有一個值。 –

0

您不需要topics。只需將rows傳入回調。即callback(null, rows);

+0

您是否閱讀過該代碼?我需要將數據傳遞給瀑布中第二個回調的結束回調,並添加第三個回調查詢的數據。 – realisation

+0

當然我讀了代碼。看來你不明白JavaScript中的變量是對象的引用。在你的第三個瀑布回調'行'中,'callbackRows'和'topics'都引用同一個對象。只需將'callback(null,topics);'改爲'callback(null,rows);'並且你的代碼應該可以工作。 – SpiderPig

+0

等一下,我剛剛在代碼中發現了第二個錯誤。回調函數,在if之後需要在db.query回調中。此外,它還需要位於所述if的其他部分。 – SpiderPig