【问题标题】:how to make axios call synchronous? [duplicate]如何使axios调用同步? [复制]
【发布时间】:2019-01-04 22:26:53
【问题描述】:

我遇到了 get_user() 在 console.log(usersOutput, 'here') 之后运行的问题。如何更改它以使 get_user() 先运行?

function get_user(user){
        axios.get(`/api/admin/users`,{params:{idnum:user}}).then((user)=>{
           console.log('got user')
           return user.data
        })
}

var UsersFormatter = function(c){
    let usersOutput = 'waiting for change'
    var usersOutput = get_user(c.cell.row.data.sessionUser)
    console.log(usersOutput,' here')
    return usersOutput
}

【问题讨论】:

  • JavaScript 中的 Promises 和 async/await 函数值得学习。

标签: javascript node.js


【解决方案1】:

不要让它同步,这会阻塞线程,这是你永远不想做的。只需从函数返回 Promise 并传递 Promise 而不是数据:

function get_user(user){
    // return this promise
    return axios.get(`/api/admin/users`,{params:{idnum:user}}).then((user)=>{
        console.log('got user')
        return user.data
    })
}

var UsersFormatter = function(c){
    // return this promise too, so callers of UserFormatter can get the data 
    return get_user(c.cell.row.data.sessionUser)
    .then((data) => /* format data and return */)
}

【讨论】:

  • 网络工作者呢?我觉得阻塞网络工作者线程很好。
  • OP 似乎非常不太可能使用网络工作者并以这种形式提出这个问题。但是如果你推荐在 web worker 中同步使用 Axios,请贴出答案。我很想知道这一点。
  • 我最终在 web worker 中使用了 async/await。我认为这是一个很好的方法,因为您不需要为主线程和 Web 工作线程学习不同的方法。
【解决方案2】:

您可以利用 axios 承诺并使用 async/await。所以是这样的:

function get_user(user){
        return axios.get(`/api/admin/users`,{params:{idnum:user}})
}

var UsersFormatter = async function(
    let usersOutput = await get_user(c.cell.row.data.sessionUser)
    console.log(usersOutput,' here')
    return usersOutput
}

【讨论】:

  • 我实际上从你的回答中得到了以下错误:SyntaxError: redeclaration of let usersOutput
  • 那是因为您要声明 usersOutput 两次。我刚刚编辑了上面的代码。
  • UsersFormatter 也是异步的。那么 axios 和你的函数有什么区别呢?
  • 没什么,get_user 只是一个包装器。我只是在效仿他的榜样。
猜你喜欢
  • 2021-11-13
  • 2021-05-05
  • 2015-12-27
  • 2022-01-25
  • 2013-10-18
  • 2021-01-25
  • 2023-02-11
  • 2012-01-20
  • 2018-08-05
相关资源
最近更新 更多