javascript - NodeJS 异步函数不暂停

标签 javascript node.js promise async-await

我有一个异步函数,它使用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

最佳答案

您的runCypherQuery 目前没有返回任何特殊内容。为了await它,您需要显式指定它返回一个Promise,该Promise在请求完成后解析。只是 await 一个 async 函数并不意味着 async 函数在解析之前等待所有异步操作完成。将基于回调的 request 转换为 Promise 并返回该 Promise,以便可以正确进行 await 编辑:

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

关于javascript - NodeJS 异步函数不暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51684564/

相关文章:

javascript - 在等待 promise 完成时无法在 Vue.js 中获取 DOM 更新

javascript - qTip2 - 更改类更改时使用的工具提示内容

c++ - 无法安装 node-sass node.lib : fatal error LNK1107: invalid or corrupt file: cannot read at 0xB8790

javascript - 在 promise 中编写同步代码的正确方法是什么?

javascript - 返回 "then"内具有 "Promise.then()"函数的对象

javascript - Browserify 捆绑未定义的依赖项

javascript - 获取返回 JSON 的外部 API 时出现问题

javascript - 在 Sails 的 Waterline beforeUpdate Hook 中获取当前值

mysql - Migrations 在指定列和索引列之后添加列

javascript - 在 promise 解决后按文件执行独特的操作