为了账号安全,请及时绑定邮箱和手机立即绑定

无法弄清楚如何等待 Promise

无法弄清楚如何等待 Promise

潇湘沐 2021-09-17 10:18:01
我有一个包含用户 ID 的数组,我需要找出每个 ID 的名称并将它们返回到一个数组中。我可以从数据库中获取用户名,使用 knex 并将它们推送到一个数组中,但是当我尝试发送数据时,它始终是一个空数组。我对 Promises 不太擅长,所以不知道如何应用到我的项目中。const userId = [10,11,12,13]let users = []userId.map(id => {    db.select('name').from('users').where('user_id', id)    .then(user => {        users.push(user)    })})res.json(users)我希望响应等待循环完成并发送用户数组。
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

首先,您需要在运行之前等待所有承诺完成 res.json(...)


其次,您不应该在承诺解析后改变外部变量(承诺解析的顺序将改变您的输出,这并不好。


像这样的东西应该可以正常工作


const userId = [10,11,12,13]


// map userId array to promise array

// Promise.all aggregates a promise array into one big promise that resolves when all promises resolve (and preserves array order)

Promise.all(

  userId.map(id =>

    db

      .select("name")

      .from("users")

      .where("user_id", id)

  )

)

  .then(users => res.json(users))

  .catch(e => console.error("Error::", e));


/*handle error in the catch block*/


/* visual example of Promise.all.then block

Promise.all([           users = [

   getUser(10),    ->     {userId: 10, ....}

   getUser(11),    ->     {userId: 11, ....}

   getUser(12)     ->     {userId: 12, ....}

])                      ]


*/


查看完整回答
反对 回复 2021-09-17
?
茅侃侃

TA贡献1842条经验 获得超21个赞

作为替代答案,以下是您如何针对此特定查询对数据库进行 1 次旅行,这意味着您无需等待多个 Promise 并减少数据库的负载


knex.raw(

  'select name from users where user_id in (' + userId.map(_ => '?').join(',') + ')', 

  [...userId]

);


查看完整回答
反对 回复 2021-09-17
  • 3 回答
  • 0 关注
  • 411 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信