2015-11-05 66 views
0

我需要某些非常基本的帮助,我似乎无法解决。仅在异步处理循环完成后呈现视图

下面的代码循环输入文件,将行插入数据库并呈现结果视图。

我的问题是视图在所有数据库回调运行之前呈现,所以它总是好像处理了0行。

如何在所有回调被调用后才能渲染?

router.post('/upload', function(req, res) { 
    var good_rows = 0; 
    var bad_rows = 0; 

    ... // get file data 

    _.each(data, function(fileRow) { 
     var dbRow = { 
      data1: fileRow.data1, 
      data2: fileRow.data2 
     }; 

     // insert row to db 
     model.create(dbRow, function(insertedCount) { 
      // this callback is called only after the view was rendered :(
      if (insertedCount == 1) good_rows++; 
      else bad_rows++; 
     }); 
    }); 

    res.render('upload_result', { 
     result: { 
      good_rows: good_rows, 
      bad_rows: bad_rows, 
      log_location: '#' 
     } 
    }); 
}); 

回答

1

你需要每个回调后进行检查,所有的操作都完成

_.each(data, function(fileRow) { 
     var dbRow = { 
      data1: fileRow.data1, 
      data2: fileRow.data2 
     }; 

     // insert row to db 
     model.create(dbRow, function(insertedCount) { 

      if (insertedCount == 1) good_rows++; 
      else bad_rows++; 
     //on each callback check if completed 
     if(good_rows+bas_rows >= data.length) 
     res.render('upload_result', { 
      result: { 
       good_rows: good_rows, 
       bad_rows: bad_rows, 
       log_location: '#' 
      } 
     }); 
     }); 
    }); 
+0

TNX,这就是我的想法。 – Juvaly