Node.js 遵守秩序

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) => {

我正在使用bluebird Promise map处理一组文件行,其中一些行需要进行一些转换。转换是通过调用web服务完成的

我编写了一个函数,该函数返回一个与转换数组解析的承诺

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")
}