Лучший способ обработать случай, когда один и тот же код должен выполняться либо сразу, либо после разрешения обещания - PullRequest
2 голосов
/ 18 марта 2020

В зависимости от определенного условия x мне нужно выполнить перенаправление либо прямо сейчас, либо после того, как обещание asyncFunction выполнено:

if (x) {
  await asyncFunction();
  redirectToA();
}
redirectToA();

Хотя это довольно уродливо. Есть ли способ упростить этот код, чтобы redirectToA(); появлялся только один раз?

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Я думаю, вы могли бы просто сделать это:

if (x) {
  await asyncFunction();
}
redirectToA();

Это пример, показывающий, что redirectToA() будет ждать:

async function asyncFunction() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve()
    }, 3000)
  })
}

function redirectToA() {
  document.getElementById('status').innerText = "Redirected"
}


(async function() {
  // your code is here
  if (true) {
    await asyncFunction()
  }
  redirectToA()
})()
<p id="status">
  Running
</p>
0 голосов
/ 19 марта 2020

Возможно, это не проблема, но я бы хотел позвонить redirectToA() по адресу nextTick + при обоих условиях.

await (x ? asyncFunction() : Promise.resolve());
redirectToA();

Таким образом, вам лучше гарантируется согласованное поведение перенаправления, и вы, возможно, выиграете от меньшего количества тестирования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...