Несколько вызовов resol () внутри обещания, возвращающего функцию asyn c - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть следующая функция testAsyn c, которая должна возвращать разрешенное обещание после вызова resolve().

async function wait(time) {
    await new Promise((resolve, reject) => { setTimeout(resolve, time) });
}

async function testAsync(testParam) {
    return new Promise(async (resolve, reject) => {
        try {
            await wait(2000); // do some async work
            if (testParam === 1) {
                console.log("test param is equal to 1");
                resolve("first IF");
            }
            if (testParam < 10) {
                console.log("test param is smaller than 10");
                resolve("second IF");
            }
        } catch (error) {
            reject(error);
        }
    });
}

(async () => {
    let result = await testAsync(1);
    console.log(result);
})();

вывода консоли:

test param is equal to 1
test param is smaller than 10
first IF

Моя проблема в том, что если Я структурирую код таким образом, чтобы он включал больше вызовов к resolve(), которые не являются исключительными, код разрешает первый, который он ударил, но не останавливается и не возвращается в этом месте. Почему это продолжается? Разве resolve() не является свободно равным return? Должен ли я просто добавить return после каждого resolve() вызова?

1 Ответ

4 голосов
/ 27 апреля 2020

return new Promise(async (resolve, reject) => { является антипаттерном. Добавление async перед функцией уже вернет Обещание. new Promise должен использоваться только для преобразования ни одной базовой асинхронной функции Promise c в функцию, в которой используется Promise.

Не является ли resol () свободно равным return?

Равенство только в том смысле, что оно устанавливает «возвращаемое» значение обещания, но не нарушает поток выполнения. Так что да, вам нужно будет поставить return после разрешения, если вы хотите предотвратить выполнение следующего кода.

Но, как я уже сказал, показанная конструкция в любом случае является антишаблоном и testAsync должно выглядеть так:

async function testAsync(testParam) {
  await wait(2000); // do some async work

  if (testParam === 1) {
    console.log("test param is equal to 1");
    return "first IF";
  }

  if (testParam < 10) {
    console.log("test param is smaller than 10");
    return "second IF";
  }
}

И wait, скорее всего, будет написано так:

function wait(time) {
    return new Promise((resolve, reject) => { setTimeout(resolve, time) });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...