Javascript 如何在使用Promissions和arrow函数发送响应之前等待异步数据?

Javascript 如何在使用Promissions和arrow函数发送响应之前等待异步数据?,javascript,node.js,asynchronous,promise,arrow-functions,Javascript,Node.js,Asynchronous,Promise,Arrow Functions,我不熟悉ES6,箭头函数和承诺,我不知道如何使用它们,更糟糕的是一起使用 我用REST生成器()启动了一个项目,它工作正常,但我需要修改部分身份验证 我需要在身份验证期间从第三方服务器返回数据。我创建了使用axios正确返回数据的函数,但是我无法将此信息与其他信息(来自此项目)一起返回,之前会发送响应 下面是生成的代码,几乎不可触摸,我只添加了extraData:user.getExtraData(user) 下面是我添加到用户模型中的函数 getExtraData (userView) {

我不熟悉ES6,箭头函数和承诺,我不知道如何使用它们,更糟糕的是一起使用

我用REST生成器()启动了一个项目,它工作正常,但我需要修改部分身份验证

我需要在身份验证期间从第三方服务器返回数据。我创建了使用axios正确返回数据的函数,但是我无法将此信息与其他信息(来自此项目)一起返回,之前会发送响应

下面是生成的代码,几乎不可触摸,我只添加了
extraData:user.getExtraData(user)

下面是我添加到用户模型中的函数

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        
      })
}

如何使响应等待直到使用给定代码从getExtraData函数返回extraData为止?谢谢

您可以使用异步/等待。在这种情况下,您需要等待
获取外部数据
。因此,
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
    }
}

getExtraData
不会返回任何内容-它能返回的唯一有用的东西是承诺。。。所以
extraData:
将是一个承诺,而不是一个承诺value@JaromandaX对但是如何将response.data分配给extraData呢?异步的@丹尼尔,让我知道这是否适合你。否则,告诉我哪里出错了嗨,我在wait user.getExtraData(user)上出错了。SyntaxError:auth/controller.js:await是一个保留字Hey。。。。你帮了我很多忙,现在开始工作了。我需要解决一件小事。我必须将async放入
,然后(async(token)=>({
而不是
export const login=async({
ThanksOh,上帝!你说得对Daniel。事实上,我从来没有注意到调用
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
    }
}