рекомендации по возврату асинхронного обещания (TypeScript) - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы знать, какой путь предпочтительнее и почему в этом методе возвращаются обещания пользователей.

Потому что я немного растерялся, из-за чего есть лучшие практики и есть ли лучший!

Есть что-то, чего я не понимаю?

1

getUserList(): Promise<User[]> {
    return userService.getList();
}

2

async getUserList(): Promise<User[]> {
    return userService.getList();
}

3

async getUserList(): Promise<User[]> {
    return await userService.getList();
}

РЕДАКТИРОВАТЬ

1

Я знаю, что это возвращает обещание вызывающему, и вызывающий должен сам управлять обещанием.

2

Это кажется довольно странным, и я думаю, что асинхронность бесполезна, но я видел это часто ... вот почему это вопрос.

3

Обещание разрешается вметод и вызывающая сторона должны использовать try-catch для управления ошибками.Это может быть полезно, когда вызывающая сторона управляет многими асинхронными вызовами одновременно ... и мы хотим управлять ошибками на уровне просмотра.

1 Ответ

0 голосов
/ 23 октября 2018

TL; DR: Ваш первый пример верен.

1

getUserList(): Promise<User[]> {
    return userService.getList();
}

Этот метод я бы использовал.Поскольку вы не используете await в теле метода и предполагаете, что getList() возвращает обещание, нет необходимости объявлять метод async.

2

async getUserList(): Promise<User[]> {
    return userService.getList();
}

Все async методы неявно возвращают Promise.Рассмотрим следующее:

async getNumber() {
    return 1;
}

Это на самом деле возвращает Promise<number>.По этой причине ваш пример № 2 аннотирован неправильно и из трех примеров является единственным функционально некорректным.На самом деле, так выглядит подпись типа с учетом того, что она делает:

async getUserList(): Promise<Promise<User[]>>

Редактировать: В соответствии это , если объект обещания возвращается async метод, он не переупакован в обещание, поэтому этот пример может быть похож на # 3 в том, что его объявление async все еще функционально корректно, хотя и ненужно и запутанно.

3

async getUserList(): Promise<User[]> {
    return await userService.getList();
}

Это просто избыточно.Вы await получаете результат обещания, а затем неявно перематываете его в обещание перед его возвратом.Это действительно было бы полезно, если бы вы await использовали больше вещей в теле функции, например:

async getUserList(): Promise<User[]> {
    const someRequiredValue = await userService.someOtherThing();
    return await userService.getList(someRequiredValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...