我需要在1个大字符串变量中做大约100个子串替换。
规则是:我需要它是顺序的,以便第二次替换在第一次完成之前不能执行。每个后续的替换呼叫必须等待,直到第一个完成。必须使用相同的变量将先前替换的结果字符串解析为下一个替换调用。
以下在我的案例中不起作用,因为在异步环境中,LINE2将在LINE1之前完成:
LINE1: HTML = HTML.Replace("Roger", SomeLargeFunction());
LINE2: HTML = HTML.Replace("Peter", "John");
我知道这可以通过使用Promises()解决,但我根本无法完成这项工作。你能告诉我我做错了吗?
以下是一个让它易于理解的例子,但即使这个简单的代码也无法正常工作......没有错误,该功能只会卡在某处。
var MyName = "JOHN LENXYZ";
MyName.replace("X", "N")
.then(MyName => return MyName.replace("Y","O"))
.then(MyName => return MyName.replace("Z","N"))
.then(MyName => console.log ("Right Name: " + MyName))
编辑:我对我的问题并不是很清楚,所以请允许我详细说明一下:
HTML是一个包含大型HTML文件的变量,基本上是包含这些子字符串的表:[FNAME],[LNAME],[DOB],[INCOME]等等。实际上有100个这样的子串我必须逐个替换并使用自定义表单中的信息
在某些情况下,这些子字符串可以替换为直接从输入字段获取的值($ w("#FirstName"。)。),但在其他情况下使用自定义函数()的值。
看看这个真实案例,这是我的第一个逻辑实现:
LINE 001: HTML = HTML.replace("[DOB]", DateToString($w("#DOBPicker").value));
LINE 002: HTML = HTML.replace("[CALC]", Calculations());
.
.
// THIS REPLACEMENT GETS REPEATED 100 TIMES
.
.
LINE 099: HTML = HTML.replace("[FIRST]", $w("#FirstName").value)
LINE 100: HTML = HTML.replace("[LAST]", $w("#LastName").value);
正如您所看到的,每次更换字符串HTML时,都会在下一行中一次又一次地使用它,直到所有子字符串" [xxxxx]"变量HTML内部完全被替换。
现在,这是一个有趣的部分:由于线001和线002比线099和100需要更多的时间来处理,令人难以置信的是线099和100得到他们的结果!是的,“REPLACE”在第099行和第100行之前完全执行。在001和002行之前。这是异步执行。
问题是:由于LINE 002中的替换是最后要完成的(因为函数Calculations()需要更长的时间才能完成),从003到LINE 100的所有替换(已经完成)GET覆盖HTML变量在LINE 002中的值。它就像回滚效果一样。
正如您所看到的,这就是我需要在执行nex替换之前完全完成每次替换的原因。完美的解决方案是使用Chained Promises,但我无法弄清楚如何去做。
我正在使用JavaScript。 任何帮助将不胜感激,
谢谢。
答案 0 :(得分:0)
感谢大家的反馈,非常感谢。 我终于以这种方式解决了我的问题:
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
// expected output: "resolved"
}
asyncCall();