我正在使用蓝鸟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"));
});
});
}
但是,processed
与data
的顺序不同,我需要保持相同的顺序(因为这是一个文件处理,需要以相同的顺序输出处理过的文件)输入文件)。
这是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。
答案 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.each
或Promise.reduce
并且可以进行顺序处理。