ESLint выдает неиспользуемые обещания, когда анонимная функция использовалась для ожидания нескольких асинхронных вызовов

#typescript #typescript-eslint

#typescript #typescript-eslint

Вопрос:

Итак, я с удовольствием использую эти промежуточные функции для переноса асинхронных операций, которые мне нужно выполнять последовательно. Например, «убедитесь, что база данных sqlite существует, затем создайте схему открытия» и т. Д. Я только что переключился на ESLint и не могу понять, какой синтаксис он хочет, и когда я даю ему то, что, по моему мнению, он хочет, это все равно не работает, а также не компилируется. Если я сделаю очевидную вещь и переключу version2 на использование Promise<boolean> , то компиляция завершится с ошибкой: src/dimTest.ts(23,13): error TS2322: Type 'void' is not assignable to type 'boolean'

Я что-то недопонимаю в обещаниях и мне просто повезло, что это работает, или это проблема ESLint? Спасибо!

 /* eslint-disable no-console */
class test {
    constructor() {
        // ;
    }

    // this is what I originally used
    async version1():Promise<boolean> {
        return new Promise(async (resolve,reject) => {
            await this.delay(2000);
            await this.delay(500);
            await this.delay(250);
            resolve(true)
        });
    }

    // This method compiles but eslint is still says misused promise
    async version2(): Promise<boolean> {
        return new Promise(async (resolve, reject):Promise<any> => {
            await this.delay(2000);
            await this.delay(500);
            await this.delay(250);
            resolve(true);
        });
    }
    public async main(): Promise<void> {
        console.log("Hello!");
        await this.version1();
        console.log("Goodbye!");
        console.log("Hello!");
        await this.version2();
        console.log("Goodbye!");
    }

    protected delay(ms: number = 5000 ): Promise<number> {
        return new Promise((resolve) => { setTimeout(resolve, ms); });
    }
}
export { test };

const dt = new test();
void dt.main();
  

Комментарии:

1. Это правило восхитительно, и я об этом не знал. eslint правильно помечает анти-шаблон вашего кода, и это именно то, что должен делать линтер. Как указано @ShivamPandey, в его ответе вы создаете ненужные обещания. Я бы добавил, что использование async без await также является анти-шаблоном

Ответ №1:

Если функция async , то нет необходимости возвращать обещание,

 async version1(): Promise<boolean> {
        await this.delay(2000);
        await this.delay(500);
        await this.delay(250);
        return true;
    }