代码之家  ›  专栏  ›  技术社区  ›  Fede E.

保证地图秩序

  •  2
  • Fede E.  · 技术社区  · 6 年前

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

    我编写了一个函数,它返回一个promise,该promise通过转换后的数组解析。

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

    然而, processed 顺序不同于 data ,并且我需要保持相同的顺序(因为这是一个文件处理,它需要以与输入文件相同的顺序输出处理过的文件)。

    这是tokenize函数(它调用webservice):

    function Tokenize(value){
    
        return new Promise(function(resolve, reject){
            var requestPath = `http://localhost:8080/transform/${value}`;
            request.get(requestPath, function(err, response, body){
                if (!err && response.statusCode == 200){
                    resolve(body);
                }else{
                    reject(err);
                }
            });
        });
    
    }
    

    如何保持数组顺序并返回相同但已转换的数组?考虑到webservice能够处理超过1000 tps。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Marcos Casagrande    6 年前

    Promise.map resolved value是一个数组,其中每个元素按顺序是每个回调的返回/解析值。

    所以不必推到数组中,只需返回被推的值,然后 约定地图 会帮你处理订单的。

    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 ,使代码更清晰。