Javascript 蓝知更鸟是自然界的障碍吗

Javascript 蓝知更鸟是自然界的障碍吗,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我可能对蓝鸟的基本功能有点陌生。我试图实现的是一个API服务器,它可以将250K+行的大容量写入数据库。完成请求大约需要30秒。我希望API服务器根据批量写入的成功返回ok或error。当我不使用承诺时,我没有机会冒充错误,因为请求没有等待批量写入完成。但是,如果我使用promise,错误和成功会正常工作。但在操作完成之前,服务器将变得无响应。简而言之,使用promise库处理大容量写入会阻塞API服务器 function chunk(arr, chunkSize) { var R = []

我可能对蓝鸟的基本功能有点陌生。我试图实现的是一个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))
            })
            })

}
功能块(arr,chunkSize){
var R=[];

对于(var i=0,len=arr.length;i来说,这是因为您正在调用同步行为

var workbook = XLSX.readFileSync(__dirname + '/dbo_tblCPLParts_.xlsx');
您应该改为使用与的XLSX等效的,它是异步的。或者,由于您使用的是bluebird,您可以在
XLSX
模块上使用:

var Promise = require('bluebird')
var fs = Promise.promisifyAll(/* the XLSX module */)
这将允许您将所有XLSX模块视为承诺。

这里是一个协议

最近在io.js(NodeJS)中添加了一个同步io标志。获取最新版本并使用
--trace sync io
运行它。它将解决所有同步阻塞问题-我怀疑它们与承诺无关


至于bluebird-它没有阻塞。

所有js都阻塞(setTimeout/interval除外)。只有主机可以提供休息的机会。任务通常需要30秒才能完成,但在承诺之前,您并不知道。感谢您指出这一点。不幸的是,XLSX模块内部使用fs.readfileSync。我尝试转换它,但它不起作用。我想我需要查看子进程和其他并行进程正在处理内容。@UmaMaheshwaraa有xlsx模块的异步版本吗?找到了一个,但它是另一个库。需要看看它是否适合我的目的。@UmaMaheshwaraa你能解决你的问题吗?@UmaMaheshwaraa你不需要承诺;你只需要异步的东西(即带有回调的东西)。有用吗?