2017-02-11 7 views
5

я наткнулся на следующий метод ES6 во время Rewiew:Каков правильный синтаксис для метода, объявленного как async?

async getUsers(res) { 
    User.findAll().then(users => res.json(users)); 
} 

Это кажется багги мне. Я ожидал бы следующее:

async getUsers(res) { 
    return User.findAll().then(users => res.json(users)); 
} 

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

+0

'async' не ES6, это ES7 – smnbbrv

+1

Что такое' res'? Btw, если нет никакого 'ожидания '- вам вообще не нужно' async'. – zerkms

+0

@zerkms Вероятно, выраженный объект ответа –

ответ

2

Код, как написано (без return), вероятно, прекрасен, если вызывающему абоненту не нужен доступ к асинхронно полученному значению.

Прежде всего, async необходим как часть определения функции ТОЛЬКО, если вы планируете использовать await внутри функции. Если вы не используете await внутри (код которого не отображается), то часть определения async не требуется. Таким образом, это, вероятно, может быть именно это:

getUsers(res) { 
    User.findAll().then(users => res.json(users)); 
} 

Во-вторых, если абонент хочет использовать await на функцию getUsers(), то он должен вернуть обещание (как вы предложили). Если вызывающий абонент не использует await с ним или иным образом нуждается в каком-либо доступе к возвращаемому значению, то return не требуется. Таким образом, если вы хотите использовать await этой функции, то это, вероятно, следует это:

getUsers(res) { 
    // return promise so caller can get async value 
    return User.findAll().then(users => { 
     res.json(users); 
     return users;  // return value so caller can get access to the value 
    }); 
} 

Таким образом, исходный код может быть просто прекрасно, пока абонент никогда не ожидает асинхронное возвращаемое значения из этой функции (что возможно здесь, потому что результат операции async отправляется с res.json(), и это может быть единственным результатом, который необходим. Что касается await/async, вам нужно только вернуть обещание от функций, которые вы планируете использование ждут на


Чтобы резюмировать:.

  1. async необходим, только если вы планируете использовать await внутри функции. Вероятно, ваша функция вообще не нуждается в ключевом слове async.
  2. Возвращаемое обещание необходимо только в том случае, если вызывающий абонент хочет получить доступ к асинхронному ответу либо через традиционный f().then(), либо через let x = await f().
  3. Вызывающий может await функция, которая не помечена как async. await получит возвращаемое значение от функции, и, если возвращаемое значение не является обещанием, оно обернет его в разрешенное обещание. Если это обещание, оно будет ждать его разрешения.

FYI, это очень хороший, короткий и сладкий review of async/await и как они взаимодействуют с обещаниями.

+0

Очень хороший ответ. Так вот почему этот код полон гонок. –