Почему @ typescript-eslint / обещание-функция-asyn c запускается этим кодом? - PullRequest
0 голосов
/ 16 июня 2020

У меня есть этот код в моем маленьком проекте:

close(flush = false): void {
    if (this.ws?.CLOSING || this.ws?.CLOSED) {
        return;
    }

    if (flush) {
        // I really don't know how to fix that
        // eslint-disable-next-line @typescript-eslint/promise-function-async
        const sendPromises = this.state.queue.map((message) =>
            this.sendAsync(message)
        );
        void Promise.all(sendPromises).then(() => this.ws?.close());
    } else {
        this.ws?.close();
    }
}

Когда я запускаю xo (который использует typescript-eslint), @typescript-eslint/promise-function-async терпит неудачу. Я внес несколько изменений, но все равно не работает. Может ли кто-нибудь объяснить мне, почему это не работает?

Что я пробовал:

// first
const sendPromises: Promise<void> = this.state.queue.map((message) => this.sendAsync(message));
// second
const sendPromises = this.state.queue.map((message): Promise<void> => this.sendAsync(message));

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Вот описание правила @typescript-eslint/promise-function-async:

Требует, чтобы любая функция или метод, возвращающий Promise, были помечены как asyn c.

С примером для неверный код:

const arrowFunctionReturnsPromise = () => Promise.resolve('value');

function functionReturnsPromise() {
  return Promise.resolve('value');
}

и правильный код:

const arrowFunctionReturnsPromise = async () => Promise.resolve('value');

async function functionReturnsPromise() {
  return Promise.resolve('value');
}

Ваш код не работает первым строка примера. В частности, проблема здесь:

const sendPromises = this.state.queue.map((message) =>
  this.sendAsync(message)
);

Вы вызываете .map() с помощью стрелочной функции, которая производит обещание, поэтому, согласно правилу, вы должны пометить его как async вот так:

const sendPromises = this.state.queue.map(async (message) =>
//                                        ^^^^^
  this.sendAsync(message)
);
0 голосов
/ 16 июня 2020

Прочитав комментарии, я заметил, что мне нужно добавить async к моей стрелочной функции.

По иронии судьбы, я исправлял ту же ошибку раньше, но упустил из виду эту.

Спасибо за помощь.

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