Node.js 遵守秩序
我正在使用bluebird Promise map处理一组文件行,其中一些行需要进行一些转换。转换是通过调用web服务完成的 我编写了一个函数,该函数返回一个与转换数组解析的承诺Node.js 遵守秩序,node.js,Node.js,我正在使用bluebird Promise map处理一组文件行,其中一些行需要进行一些转换。转换是通过调用web服务完成的 我编写了一个函数,该函数返回一个与转换数组解析的承诺 function tokenizeChunk(data){ return new Promise(async (resolve, reject) => { let processed = []; await Promise.map(data, async (line) => {
function tokenizeChunk(data){
return new Promise(async (resolve, reject) => {
let processed = [];
await Promise.map(data, async (line) => {
try{
const lineCode = line.substring(0,4);
if (lineCode != "0500") processed.push(line);
else{
// find string, tokenize, replace
const stringFound = line.substring(55,71);
var re = new RegExp(stringFound,"g");
processed.push(line.replace(re, await Tokenize(stringFound)));
}
}catch(err){
console.error(err);
process.exit();
}
}, {concurrency: 50}).then(() => {
resolve(processed.join("\r\n"));
});
});
}
但是,处理的
与数据的顺序不同,我需要保持相同的顺序(因为这是一种文件处理,需要以与输入文件相同的顺序输出处理后的文件)
这是标记化函数(调用webservice):
如何保持数组顺序并返回相同但已转换的数组?考虑到webservice能够处理1000多个TPS。Promise.map
resolved value是一个数组,其中每个元素按顺序是每个回调的返回/解析值
因此,只需返回推送的值,而不是推送到数组,Promise.map
将为您处理订单
async function tokenizeChunk(data) {
const result = await Promise.map(data, async(line) => {
const lineCode = line.substring(0, 4);
if (lineCode != "0500")
return line;
// find string, tokenize, replace
const stringFound = line.substring(55, 71);
var re = new RegExp(stringFound, "g");
return line.replace(re, await Tokenize(stringFound));
}, { concurrency: 50 });
return result.join("\r\n")
}
您可以删除new Promise()
包装器,使函数async
,使代码更清晰。Promise.map
不保证执行顺序-使用Promise.each
或Promise.reduce
如果您需要,并且可以进行顺序处理
API:
更多详细信息:Awesome Marcos。格雷西亚斯!德纳达!:P、 很乐意帮忙!
async function tokenizeChunk(data) {
const result = await Promise.map(data, async(line) => {
const lineCode = line.substring(0, 4);
if (lineCode != "0500")
return line;
// find string, tokenize, replace
const stringFound = line.substring(55, 71);
var re = new RegExp(stringFound, "g");
return line.replace(re, await Tokenize(stringFound));
}, { concurrency: 50 });
return result.join("\r\n")
}