Почему я должен поместить ключевое слово async в функции, которые ожидают ключевых слов?

Я просто хочу дождаться завершения процесса, а не делать функцию асинхронной.
Посмотрите код ниже.
Мне пришлось сделать getUserList асинхронным, потому что в функции было ключевое слово await. Поэтому я также должен был написать как "await UsersService.getUserList" для выполнения метода, а также я должен был сделать родительскую функцию асинхронной. Это не то, что я хочу сделать.

import xr from 'xr' //a package for http requests

class UsersService {

  static async getUserList() {
    const res = await xr.get('http://localhost/api/users')
    return res.data
  }

}

export default UsersService

import UsersService from './UsersService'

class SomeClass {

  async someFunction() { //async again!!
    const users = await UsersService.getUserList() //await again!!
  }

}

1 ответ

Решение

Это выбор дизайна?

Ну, это из-за синхронной природы JavaScript. Если бы вы хотели, чтобы функция выполняла асинхронную команду синхронно, она блокировала бы всю программу, и это крайне нежелательно, плохо, если она на стороне клиента, ужасно, если она на стороне сервера. По этой причине async функции существуют. Эти функции взяты из нормального потока, поэтому await работает.

Зачем?

Другая причина в том, что await+async синтаксис сахара для обещаний. Обещания асинхронны, и вы не можете это остановить. Это означает, что await не выполняет синхронизацию асинхронной функции, она просто поддерживает остальную часть функции await до ее завершения. Если он заблокировал весь цикл обработки событий, представьте, хотите ли вы создать приложение, которое будет отправлять данные между клиентами. Все ваше серверное приложение зависает каждый раз, когда оно делает асинхронный запрос, а не просто делает этот единственный запрос асинхронным.

Так что подумайте об этом так:

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

Так что вместо того, чтобы думать о async требование для awaitдумать о них как о комбинации (async+await) так вот как они принципиально работают. Если вы хотите узнать больше об асинхронности и ждать, я настоятельно рекомендую прочитать мою статью в блоге, которая углубляется в это.

Другие вопросы по тегам