2015-06-19 189 views
0

我可能有點新瞭解承諾esp藍鳥的基本功能。我試圖完成的是一個處理批量寫入250K +行到數據庫的API服務器。大約需要30秒才能完成請求。我希望API服務器根據批量寫入的成功返回正常或錯誤。當我不使用承諾時,我沒有機會冒出錯誤,因爲請求沒有等待批量寫入完成。但是,如果我使用承諾錯誤和成功正常工作。但是,直到操作完成後,服務器纔會響應。簡而言之,使用promise庫來處理批量寫入會阻塞API服務器。藍鳥承諾阻止自然

function chunk(arr, chunkSize) { 
    var R = []; 

    for (var i=0,len=arr.length; i<len; i+=chunkSize) 
    { 
     R.push(arr.slice(i,i+chunkSize)); 
    } 
    return promise.resolve(R); 
} 


exports.add = function(req, res) { 
var PO_STD_LT_TIME = 90; //DAYS 
    Parts.sync() 
     .then(function() { 
      return Parts.destroy({ 
       where: {} 
      }); 
     }) 
     .then(function() { 
      var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx'); 
      var sheet_name_list = workbook.SheetNames; 
      var JSON_S = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]); 

      var size = 40000; 
      chunk(JSON_S, size).then(function(JSON_Small) { 
       promise.each(JSON_Small, function (JSON_small_){ 
        Parts.bulkCreate(JSON_small_) 
        .catch(function(err) { 
         res.json(500, { 
          Error: "Error : " + err 
         }); 
        }) 

       }).finally(ext_fns.handleResult(res,200)) 
      }) 
      }) 

} 

處理這個問題的最好方法是什麼?我是否以正確的方式使用承諾?

+0

所有js都阻塞(setTimeout/interval除外)。只有主持人可以提供休息的機會 – dandavis

+0

假設任務總是花費30秒完成,但在promisifying之前,你沒有意識到。 –

回答

1

這是因爲你一直在調用同步行爲。罪魁禍首是

var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx'); 

你應該改用異步的fs.readFile的XLSX等價物。另外,由於您使用的藍鳥,你可以在XLSX模塊上使用promisifyAll

var Promise = require('bluebird') 
var fs = Promise.promisifyAll(/* the XLSX module */) 

,這將讓你把所有的XLSX模塊的承諾。

+0

謝謝你指出這一點。不幸的是,XLSX模塊在內部使用fs.readfileSync。我試圖轉換它,但它不工作。我想我需要看看子進程和其他並行處理的東西。 –

+0

@UmaMaheshwaraa是否有xlsx模塊的任何異步版本? – royhowie

+0

找到一個,但它是一個不同的庫。需要看看它是否適合我的目的。 –

1

這是一個protip。

在io.js(NodeJS)中最近添加了一個同步io標誌。獲取最新版本並使用--trace-sync-io運行它。它會找出你所有的同步阻塞問題 - 我懷疑他們不是承諾有關。

藍鳥 - 它沒有阻塞。