我需要在 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").value) 获取的值,但在其他情况下,可以替换为来自自定义函数 () 的值。
看看这个真实的案例,这是我的第一个逻辑实现:
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 被替换时,它都会在下一行中一次又一次地使用,直到变量 HTML 中的所有子字符串“[xxxxx]”被完全替换。
现在,这是有趣的部分:由于第 001 行和第 002 行比第 099 行和第 100 行需要更多的时间来处理,令人难以置信的是第 099 行和第 100 行首先得到结果!是的,“REPLACE”在第 099 行和第 100 行中在第 001 行和第 002 行之前完全执行。这就是异步执行。
问题是:由于第 002 行中的替换是最后完成的(因为函数 Calculations() 需要更长的时间才能完成),因此从第 003 行到第 100 行(已完成)的所有替换 GET使用 LINE 002 中 HTML 变量的值覆盖。这就像回滚效果。
正如您所看到的,这就是我需要在执行下一个替换之前完全完成每个替换的原因。完美的解决方案是使用 Chained Promises,但我就是不知道该怎么做。
我正在使用 JavaScript。 任何帮助将不胜感激,
谢谢。
最佳答案
感谢大家的反馈,非常感谢。 我最终通过这种方式解决了我的问题:
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();
关于JavaScript Str.Replace 为 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48468465/