首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Promise map保持秩序

Promise map保持秩序
EN

Stack Overflow用户
提问于 2018-06-11 07:31:36
回答 2查看 1.6K关注 0票数 3

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

我写了一个函数,它返回一个promise,它用转换后的数组进行解析。

代码语言:javascript
复制
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"));
    });

  });

}

但是,processeddata的顺序不同,我需要保持相同的顺序(因为这是一个文件处理,需要以与输入文件相同的顺序输出处理后的文件)。

这是Tokenize函数(调用webservice):

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-11 08:23:56

Promise.map解析值是一个数组,其中每个元素依次是每个回调的返回/解析值。

因此,不需要推入数组,只需返回推送的值,Promise.map将为您处理订单。

代码语言:javascript
复制
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,从而使代码更清晰。

票数 6
EN

Stack Overflow用户

发布于 2020-01-17 22:34:42

Promise.map不保证执行顺序-如果需要,可以使用Promise.eachPromise.reduce,并且可以进行顺序处理。

接口名:http://bluebirdjs.com/docs/api/promise.each.html

更多细节:Promise.map concurrency execution order

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50788928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档