Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

异步字符串替换

  将字符串中的某些字符替换掉本身很简单,因为 JavaScript 自带 replace 方法,而且还支持正则和回调。然而自带的 replace 方法是同步的,如果我们的需求是将匹配到的每一部分做一个异步操作获取到另一类数组后再填入原字符串,那么实现起来就有点麻烦了。
  还好 replace 函数是幂等的,我们只要传入同样的东西,无论执行几次都可以得到同样的结果。于是我们可以想将要替换的部分匹配出来放入一个数组中,然后对这个数组的每一项分别做异步操作,得到结果数组。然后再执行一次替换,把结果数组顺序放入原字符串中。这一系列的步骤看似非常不靠谱,但如果基于 replace 函数幂等这个前提的话实际上没有任何逻辑问题。
  下面代码是将字符串中的每个数组都异步地乘以 2 <script> var original = '1 + 2 = 3'; var matcher = /\d+/g; var matches = original.match(matcher); var aMulTwo = value => new Promise(resolve => { resolve(value * 2); }); Promise.all(matches.map(aMulTwo)).then(results => { var i = 0; return original.replace(matcher, () => results[i++]); }).then(result => { alert(result); }); </script>   但是将 results 填入 original 这个步骤有点恶心了,是不是有其它方法解决呢?如果支持 String.raw 的话也许可以这样 <script> var original = '1 + 2 = 3'; var matcher = /\d+/g; var matches = original.match(matcher); var aMulTwo = value => new Promise(resolve => { resolve(value * 2); }); Promise.all(matches.map(aMulTwo)).then(results => { return String.raw({ raw: original.split(matcher) }, ...results); }).then(result => { alert(result); }); </script>
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^