js: str.replace () с обещанием - PullRequest
       17

js: str.replace () с обещанием

1 голос
/ 29 января 2020

Я хочу асинхронно заменить часть строки

var str = "abc"
var str2 = str.replace(/a/g,m=>{
  new Promise(r=>r("x"),j=>j("rejected"))
      .then(result=>result)

})

console.log(str2)

Я пытался использовать async / await:

var str = "abc"
var str2 = str.replace(/a/g, async(m)=>{
  return await new Promise(r=>r("x"),j=>j("rejected"))
      .then(result=>result)

})

console.log(str2) //[object Promise]bc

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Удалите часть, которая вернет значение разрешения или отклонения

var str = "abc"
var str2 = str.replace(/a/g, async(m)=>{
  return await new Promise((r,j)=>r("x"))
})
0 голосов
/ 29 января 2020

Внутри обратного вызова .replace вы можете создать массив Promises из соответствующих подстрок , а затем игнорировать возвращаемое значение из .replace. Из массива Promises, вызовите Promise.all, чтобы получить массив замен. Затем снова вызовите .replace с тем же шаблоном и используйте функцию заменителя для замены каждой совпадающей подстроки на верхний элемент в массиве замены:

// Replace the below function with the code required for your actual API call
const getReplacement = str => Promise.resolve(`[${str}]`);

const promises = [];
var str = "abcabcb"
str.replace(/[ab]/g, m => {
  promises.push(getReplacement(m));
});
Promise.all(promises)
  .then((results) => {
    const output = str.replace(/[ab]/g, () => results.shift());
    console.log(output);
  })
  .catch((err) => {
    // handle errors
  });
...