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

Я просто хочу дождаться завершения процесса, а не делать функцию асинхронной.
См. приведенный ниже код.
Мне пришлось сделать getUserList асинхронным, потому что в функции было ключевое слово 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!!
  }

}

person Nigiri    schedule 12.07.2016    source источник
comment
Поскольку без async функция является синхронной, следовательно, она гарантированно завершит выполнение своего тела и вернет результат.   -  person zerkms    schedule 12.07.2016
comment
также мне пришлось сделать родительскую функцию асинхронной --- вместо этого вы можете использовать промисы.   -  person zerkms    schedule 12.07.2016
comment
//await again!! --- конечно, если он асинхронный, вам нужно подождать, пока он завершится.   -  person zerkms    schedule 12.07.2016
comment
await означает синхронный, верно? поэтому метод getUserList должен быть синхронным для меня.   -  person Nigiri    schedule 12.07.2016
comment
Я понимаю, что использование промисов может сделать getUserList синхронным   -  person Nigiri    schedule 12.07.2016
comment
await означает синхронный, верно? поэтому метод getUserList для меня должен быть синхронным --- нет, значит мы вызываем функцию асинхронно и сами становимся асинхронными, так как нам нужно дождаться результата   -  person zerkms    schedule 12.07.2016


Ответы (1)


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

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

Почему?

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

Итак, подумайте об этом так:

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

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

person Downgoat    schedule 12.07.2016
comment
вы делаете остальную часть программы асинхронной, чтобы справиться с этим. наконец понял!! Благодарность!! - person Nigiri; 12.07.2016
comment
Ваш блог не работает. - person Ryan White; 19.04.2018
comment
Означает ли это, что если я использовал асинхронность один раз, я должен сделать каждую функцию, использующую эту функцию, асинхронной? - person windmaomao; 09.03.2019