如何在使用承诺和箭头功能发送响应之前等待异步数据?
How to wait for async data before send response using promises and arrow functions?
我是 ES6、箭头函数和 promises 的新手,我不知道如何使用它们,更糟的是一起使用。
我用 REST 生成器 (https://github.com/diegohaz/rest) 启动了一个项目,它工作正常,但我需要修改部分身份验证。
我需要在身份验证期间return 来自第三方服务器的数据。我创建了 return 使用 axios 正确发送数据的函数,但是我不能 return 此信息以及其他信息(来自该项目),之前已发送响应。
下面是生成的代码,几乎是碰不得的,我加的只是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 函数的给定代码 return?谢谢
您可以使用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
}
}
我是 ES6、箭头函数和 promises 的新手,我不知道如何使用它们,更糟的是一起使用。
我用 REST 生成器 (https://github.com/diegohaz/rest) 启动了一个项目,它工作正常,但我需要修改部分身份验证。
我需要在身份验证期间return 来自第三方服务器的数据。我创建了 return 使用 axios 正确发送数据的函数,但是我不能 return 此信息以及其他信息(来自该项目),之前已发送响应。
下面是生成的代码,几乎是碰不得的,我加的只是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 函数的给定代码 return?谢谢
您可以使用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
}
}