代码之家  ›  专栏  ›  技术社区  ›  Mark Tyers

NodeJS异步函数未暂停

  •  2
  • Mark Tyers  · 技术社区  · 7 年前

    我有一个异步函数,它使用await调用另一个异步函数,但是第一个函数不等待第二个函数完成。

    module.exports.checkNewUser = async(uuid) => {
        const getUserQuery = `MATCH (n:USER {uuid:"${uuid}"}) RETURN n;`
        console.log(getUserQuery)
        console.log('1')
        const result = await this.runCypherQuery(getUserQuery)
        console.log('3')
        console.log('results:')
        console.log(JSON.stringify(result, null, indent))
        if(result !== []) throw new Error('user already exists')
        return
    }
    
    const request = require('request')
    const uri = 'http://localhost:7474/db/data/transaction/commit'
    
    module.exports.runCypherQuery = async(query) => {
        const headers = { Authorization: 'Basic xxx' }
        const json = {statements: [{statement: query, parameters: {}}]}
        //console.log(json)
        request.post({uri: uri, headers: headers, json: json}, (err, res, body) => {
            if(err) throw new Error(err.message)
            //console.log(body)
            const data = body.results[0].data
            console.log('data:')
            console.log(data)
            console.log('2')
            return data
        })
    }
    

    终端输出为:

    MATCH (n:USER {uuid:"xxx"}) RETURN n;
    1
    3
    results:
    undefined
    data:
    []
    2
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   CertainPerformance    7 年前

    你的 runCypherQuery 目前还没有什么特别的东西。为了 await 它,您需要显式指定它返回 Promise 一旦 request 完成。只是 等待 荷兰 async 函数并不意味着 异步 函数在解析之前等待所有异步操作完成。转换基于回调的 请求 给一个 承诺 把那个还给我 承诺 ,所以它可以 等待 正确编辑:

    module.exports.runCypherQuery = (query) => {
      const headers = { Authorization: 'Basic xxx' }
      const json = {statements: [{statement: query, parameters: {}}]}
      return new Promise((resolve, reject) => {
        request.post({uri: uri, headers: headers, json: json}, (err, res, body) => {
          if(err) reject(err.message)
          //console.log(body)
          const data = body.results[0].data
          console.log('data:')
          console.log(data)
          console.log('2')
          resolve(data)
        })
      })
    }
    
        2
  •  0
  •   Mark Tyers    7 年前

    为了完整起见,并基于@CertainPerformance给出的建议,此版本使用 request-promise 异步函数中的包。

    const rp = require('request-promise')
    const uri = 'http://localhost:7474/db/data/transaction/commit'
    
    module.exports.runQuery = async(query) => {
        const headers = { Authorization: 'Basic xxx' }
        const json = {statements: [{statement: query, parameters: {}}]}
        //console.log(json)
        const body = await rp.post({uri: uri, headers: headers, json: json})
        return body.results[0].data
    }