console.log () с извлеченным экземпляром останавливает выполнение в асинхронной функции - PullRequest
0 голосов
/ 04 ноября 2018

Я использую Sequelize в приложении Express и не могу понять, как использовать console.log () в функции async. Всякий раз, когда я хочу распечатать извлеченный экземпляр из базы данных, журнал консоли останавливает выполнение.

Это то, что я пробовал (каждый пример в отдельных попытках):

updateUser: async (_, { id, ...args }, { User }) => {
  const user = await User.findById(3)
  // will later do some update to user here
  await Promise.resolve(console.log('user: ', user)) // halts the execution
  Promise.resolve(console.log('user: ', user)) // halts the execution
  await console.log('user: ', user) // halts the execution
  console.log('user: ', await user) // halts the execution
  console.log('user: ', user) // halts the execution
  console.log('only a string') // works!
  return user
},      

Я также с 0 успехами пробовал следующее:

const user = await User.findById(3).then(user => {
  console.log('user: ', user)
})

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Предполагая, что объект User возвращает обещание, попробуйте следующее:

updateUser: async (_, { id, ...args }, { User }) => {
  const user = await User.findById(3)
  console.log('user: ', user)
  return user
}
0 голосов
/ 04 ноября 2018

console.log ничего не останавливает, await делает

Это остановит выполнение, пока User не найдет что-то:

const user = await User.findById(3).then(user => {
  console.log('user: ', user)
})

Как будет до тех пор, пока aFunction не получит ответ:

const user = await aFunction(anArg).then((do) => something);

Что вы хотите сделать, это:

var value; // have this somewhere or something similar
aFunction(anArg).then((res) => { value = res; })

Или в вашем случае:

var savedUser; // have this somewhere or something similar
User.findById(3).then((user) => { savedUser = user; console.log('user: ', user); })
0 голосов
/ 04 ноября 2018

Используя await, вы фактически указываете движку javascript остановиться, пока обещание не будет выполнено.

Обновить код

updateUser: async (_, { id, ...args }, { User }) => {
  const user = await User.findById(3)
  // will later do some update to user here
  Promise.resolve(console.log('user: ', user)) // halts the execution
  console.log('user: ', user) // halts the execution
  console.log('only a string') // works!
  return user
},

Подробнее об асинхронном ожидании - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

...