gpt4 book ai didi

javascript - Bluebird promise 本质上是阻塞的吗

转载 作者:行者123 更新时间:2023-12-02 16:03:58 25 4
gpt4 key购买 nike

我可能对 Promise 的底层功能有点陌生,尤其是 bluebird。我想要实现的是一个 API 服务器,它将 250K+ 行的批量写入处理到数据库中。完成请求大约需要 30 秒。我希望 API 服务器根据批量写入的成功返回正常或错误。当我不使用 promise 时,我没有机会冒泡错误,因为请求没有等待批量写入完成。但是,如果我使用 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))
})
})

}

处理这个问题的最佳方法是什么?我是否以正确的方式使用 promise ?

最佳答案

这是因为您一路上调用同步行为。罪魁祸首是

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

您应该使用 fs.readFile 的 XLSX 等效项,这是异步的。或者,由于您使用的是 bluebird,因此可以使用 promisifyAllXLSX 模块上:

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

这将允许您将所有 XLSX 模块视为 promise 。

关于javascript - Bluebird promise 本质上是阻塞的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com