Как ждать асинхронных данных перед отправкой ответа, используя обещания и функции стрелок? - PullRequest
0 голосов
/ 18 января 2019

Я новичок в ES6, функции стрелок и обещания, и я не могу понять, как их использовать, еще хуже вместе.

Я запустил проект с генератором REST (https://github.com/diegohaz/rest)), и он работает нормально, но мне нужно изменить часть аутентификации.

Мне нужно вернуть данные со стороннего сервера во время аутентификации. Я создал функцию, которая возвращает данные правильно с помощью axios, однако я не могу вернуть эту информацию вместе с другой информацией (из этого проекта), ответ отправляется раньше.

Ниже сгенерированный код, почти неприкасаемый, я добавил только extraData: user.getExtraData(user)

// function in auth controller file
export const login = ({ user }, res, next) => {
  sign(user.id)
    .then((token) => ({
      token, user: user.view(true), extraData: user.getExtraData(user)
    }))
    .then(success(res, 201))
    .catch(next)
}

// function in user model file
view (full) {
    let view = {}
    let fields = ['id', 'name', 'picture']
    if (full) {
      fields = [...fields, 'email', 'createdAt']
    }
    fields.forEach((field) => { 
      view[field] = this[field] 
    })     
    return view
}

Вот моя функция, добавленная в пользовательскую модель

getExtraData (userView) {
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
    axios.post( userView.host, querystring.stringify( {
      data1:userView.data1,
      data2:userView.data2
    }))
      .then((response) => {
        return response.data
      })
      .catch((error) => {
        console.log('Error', error)
        return null        
      })
}

Как лучше всего заставить ответ ждать, пока extraData не будет возвращен из функции getExtraData с заданным кодом? Спасибо

1 Ответ

0 голосов
/ 18 января 2019

Вы можете использовать async / await . В этом случае вам нужно await для getExtraData. По этой причине анонимные функции внутри login и getExtraData должны быть объявлены как асинхронные функции:

// function in auth controller file
export const login = ({ user }, res, next) => {
    sign(user.id)
    .then(async (token) => ({
        token, 
        user: user.view(true), 
        // Wait for getExtraData to finish using await
        extraData: await user.getExtraData(user)
    }))
    .then(success(res, 201))
    .catch(next)
}

async getExtraData (userView) {
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

    try {
        const response = await axios.post( userView.host, querystring.stringify( {
            data1:userView.data1,
            data2:userView.data2
        }))

        return response.data
    }
    catch (err){
        return null
    }
}
...