蓝鸟承诺在自然界中阻挡

时间:2015-06-19 20:10:39

标签: javascript node.js promise bluebird

我可能有点新的了解承诺esp bluebird的潜在功能。我想要完成的是一个API服务器,它处理250K +行的批量写入数据库。完成请求大约需要30秒。我希望API服务器根据批量写入的成功返回ok或error。当我不使用承诺时,我没有机会冒泡错误,因为请求不等待批量写入完成。但是,如果我使用promise,则错误和成功正常。但是,在操作完成之前,服务器将无法响应。简而言之,使用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))
            })
            })

}

处理此问题的最佳方法是什么?我是以正确的方式使用承诺吗?

2 个答案:

答案 0 :(得分: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模块视为承诺。

答案 1 :(得分:1)

这是一个原型。

最近在io.js(NodeJS)中添加了同步io标志。获取最新版本并使用--trace-sync-io运行它。它会弄清楚你所有的同步阻塞问题 - 我怀疑它们不是相关的承诺。

至于蓝鸟 - 它没有阻挡。