Почему кажется, что команды await не действуют? - PullRequest
1 голос
/ 14 мая 2019

У меня есть проблема, когда кажется, что операторы await на самом деле ведут себя не так, как задумано.

Если я правильно понимаю, await this.$socket.emit('get_current_user' ... должен фактически закончиться до следующего оператора, который console.log(this.current_user)

Но, похоже, это не так.

        // get user object from server
        await this.$socket.emit('get_current_user', async (current_user) => {
            if (current_user) {
                this.current_user = await current_user // threw this in just to try it...
                console.log(this.current_user) // this shows the expected output
                // {__ob__: Observer}
                // created_at: (...)
                // nickname: (...)
                // primary_room_id: (...)
                // registered: (...)
            } else {
                // stuff
            }
        })

        console.log(this.current_user) // does not show expected output
        // appears to output an empty object
        // {__ob__: Observer}
        // __ob__: Observer {value: {…}, dep: Dep, vmCount: 0}
        // __proto__: Object
        //
        // none of the expected properties are present (such as nickname)

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Вы не можете сразу выйти из системы после ожидания / асинхронности, это не будет готово. Поскольку асинхронный вызов еще не завершен. Код Javascript выполняется сверху вниз. Поскольку вы уже используете async/await, вы можете просто изменить его следующим образом:

const current_user = await this.$socket.emit('get_current_user')

this.current_user = current_user

console.log(this.current_user)
0 голосов
/ 14 мая 2019

Вы можете попробовать это:

let user = await new Promise((accept, reject) => {
   this.$socket.emit('get_current_user', current_user => {
        if (current_user) {
            accept(current_user)
        } else {
            reject(null)
        }
    })
})

Чтобы дождаться некоторого кода, который требует обратного вызова, вы должны создать обещание. await будет ждать после разрешения пройденного обещания.

Дело не в этом, но я чувствую хорошее упражнение, чтобы сделать общее с этим:

const fromSocket = address => new Promise((accept, reject) => 
   this.$socket.emit(
      address, 
      obj => obj && accept(obj) || reject(null)
   )
)

let user = await fromSocket('get_current_user')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...