TomKing9 2022-05-11 07:42 采纳率: 77.8%
浏览 30

一个关于异步的业务难题

问题遇到的现象和发生背景

就是我需要在results里面拿到i.ownerName,但是在实际运行的过程中由于getOwnerNamePromise是异步执行的,所以它还没来得及赋值就返回给前端了,这个问题怎么解决呢?

问题相关代码,请勿粘贴截图
// 定义拿到房主名字的函数
  const getOwnerNamePromise = (id) => {
    return new Promise((resolve, reject) => {
      const selctSql = `SELECT name FROM owner WHERE id=?`
      let name = ''
      db.query(selctSql, [id], (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.send({ status: 1, message: err.message })
        if (results.length > 0) {
          name =  results[0].name
        } else {
          name = '未有该业主'
        }
        resolve(name)
      })
    })
  }

const getHouseListPromise = () => {
    return new Promise ((resolve, reject) => {

      // 定义 sql 语句
      const sql = `SELECT * FROM house`
      db.query(sql, (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.send({ status: 1, message: err.message })
        // selct 语句查询返回的结果刚好是一个数组,但是我们需要给这个数组加上一个数据项
        for (let i of results) {
          const ownerId = i.owner
          if (ownerId) {
            i.owner = ownerId
            // 查询房主名字
            getOwnerNamePromise(ownerId).then((name) => {
              i.ownerName = name
            })
          } else {
            i.owner = null
            i.ownerName = '未出售'
          }
        }
        resolve(results)
      })
    })
  }

  // 得到房产信息列表
  getHouseListPromise().then((results) => {
    console.log(results)
    res.send({ status: 0, data: results})
  })

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • 於黾 2022-05-11 08:48
    关注

    所有异步方法,都应该有回调函数
    好比你等快递,你可以每过一分钟就去快递站看看,也可以等快递小哥给你打电话你再下去
    电话就是回调函数
    你应该注册好回调函数,当收到数据了再推给前端
    -=-=-=
    这就好比你下单了个好物,那就应该等快递小哥给你打电话了你再去取
    而不是下单了就往快递站跑

    评论

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥15 uniapp时间组件切换语言问题
  • ¥15 寻找基于运营商机顶盒的播放器
  • ¥15 fluent二维平板强迫振动
  • ¥15 springboot+Python模型训练 有偿
  • ¥15 关于SQL Server数据库备份还原设置
  • ¥15 the HDL complexity tool使用问题
  • ¥100 用数字代替ip主机号断与旋转链接号段
  • ¥20 学校内手机热点不能使用
  • ¥15 qwen模型微调训练时grad_norm为0.0或为nan
  • ¥15 用vs2022 fortran调试只无法查看数组的值,显示发生未指定的错误