承诺地图保持秩序

时间:2018-06-10 23:31:36

标签: node.js

我正在使用蓝鸟Promise地图来处理文件行数组,其中一些行需要进行一些转换。转换是在调用Web服务时完成的。

我写了一个函数,它返回一个用转换后的数组解析的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"));
    });

  });

}

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

这是Tokenize函数(调用web服务):

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

}

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

2 个答案:

答案 0 :(得分:5)

protected void Page_Load(object sender, EventArgs e) { String[] genders = new String[2]; genders[0] = "Male"; genders[1] = "Female"; RadioButtonList1.DataSource = genders; RadioButtonList1.DataBind(); RadioButtonList1.Items.Add(new ListItem("Neutral", "Zero")); } protected void Button1_Click(object sender, EventArgs e) { lblName.Text = txtName.Text; lblSurname.Text = txtSurname.Text; lblEmail.Text = txtMail.Text; Panel1.Visible = true; if (RadioButtonList1.SelectedIndex==0) lblGender.Text = "Male"; else lblGender.Text = "Female"; } 已解析的值是一个数组,其中每个元素都是按顺序返回/解析每个回调的值。

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

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

答案 1 :(得分:0)

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

API:http://bluebirdjs.com/docs/api/promise.each.html

更多详细信息:Promise.map concurrency execution order