2016-02-09 2 views
0

Я немного новичок в NodeJS и асинхронных операциях, поэтому простите меня, если я делаю очевидные ошибки здесь.Передача массивов JSON с водопадом Async

Я пытаюсь выполнить цикл из ячеек Excel, ping ряд API с их соответствующими значениями и объединить их в объект conData, который я буду нажимать на массив.

Мой вопрос в том, как я могу объединить JSON в один массив и отправить его моему клиенту?

router.post('/load', multipartMiddleware, function (req, res, next) { 

async.waterfall([ 
    function (done) { 
     var workbook = new Excel.Workbook(); 
     workbook.xlsx.readFile(req.files.file.path) 


     .then(function() { 

      var worksheet = workbook.getWorksheet(1) 
      var colH = worksheet.getColumn(8) 
      var dataArray = [] 

      colH.eachCell(function(cell, rowNumber) { 

       var conNoteNumber = cell.value 

       starTrack.getGuid(conNoteNumber, function (guid) { 

        starTrack.getConEvents(guid[0], function (events) { 

        var last = _.last(events) 

         starTrack.getConSummary(guid[0], function (summary) { 

          var conData = { 
           rowNum: rowNumber, 
           conNum: conNoteNumber, 
           date: last['EventDate'], 
           time: last['Time'], 
           location: last['Location'], 
           status: last['Status'], 
           time: last['Time'], 
           summary: summary['StatusDescription'] 
          } 
          dataArray.push(conData)  
          done(null, dataArray) 
         }) 
        }) 
       }) 
      }) 
     }) 
    } 

], function done(err, dataArray) { 
    // console.log(bundle) 
    if (err) return next(err); 
    // console.log(dataArray) 
    res.end() 

}) 
+0

Не могли бы вы пояснить вопрос? Код, который вы опубликовали, кажется, в основном правилен. Что вы делаете, чего не хотите, или что вы делаете, чего не хотите? –

+0

Спасибо Крис - по сути, в colH.eachCell Я перебираю каждую строку и делаю серию вызовов API - объект conData в точке, где он создан, представляет собой по существу 1 единицу. Несмотря на то, что я нажимаю объекты conData json на dataArray, когда консоль регистрирует его в моей последней операции async, я получаю только один объект. –

+0

Ah - так что ваша проблема действительно зная, когда все вызовы api, которые вы делаете в этом цикле, выполняются, чтобы вы могли передать окончательный агрегированный результат в 'dataArray'? –

ответ

0

У вас есть правильная идея об использовании водопада. Я настоятельно рекомендую вам прочитать асинхронную документацию, потому что в этом коде есть другие коллекции и функции управления потоком. У меня нет возможности проверить свой ответ, но я надеюсь дать вам идею:

async.waterfall([ 
    function (done) { 
     var workbook = new Excel.Workbook(); 
     workbook.xlsx.readFile(req.files.file.path) 
     }, 
     function(err, workbook){ 
     var worksheet = workbook.getWorksheet(1) 
     var colH = worksheet.getColumn(8) 
     var dataArray = [] 

     async.map(colH.eachCell, function(cell, rowNumber){ 
      var conNoteNumber = cell.value; 
      async.waterfall([ 
      starTrack.getGuid(conNoteNumber), 
      function(err, guid){ 
       starTrack.getConEvents(guid[0]) 
       cb(guid[0]); 
      }, 
      function(err, summary){ 
       var conData = { 
        rowNum: rowNumber, 
        conNum: conNoteNumber, 
        date: last['EventDate'], 
        time: last['Time'], 
        location: last['Location'], 
        status: last['Status'], 
        time: last['Time'], 
        summary: summary['StatusDescription'] 
       } 
       dataArray.push(conData); 
       done(null, dataArray); 
      } 
      ]) 
     }); 
     } 

], function done(err, dataArray) { 
    // console.log(bundle) 
    if (err) return next(err); 
    // console.log(dataArray) 
    res.end() 

}) 

Вы можете видеть, во втором методе массива водопада, я называю .map функцию, чтобы применить функция для каждого элемента (ячейки) коллекции (colH). Есть небольшие различия между .map и .each в асинхронной библиотеке. Обязательно прочитайте их и решите, какой из них вам нужен.

В async.map, я использовал другой async.waterfall. Как вы, возможно, знаете, асинхронный водопад автоматически передает результат функции в качестве аргумента следующей функции.

Надеюсь, это поможет, если у вас есть дополнительные вопросы, прокомментируйте. У меня было довольно сложное время с асинхронной библиотекой пару месяцев назад, и лучший совет, который я могу дать, - внимательно прочитать документацию (here).

+0

Melis - во-первых, очень спасибо. Я определенно пропустил некоторые из более сложных потоков управления этой библиотекой, поэтому я обязательно прочитаю документы. Теперь я включаю ваши предложения и буду следить за вами. –

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