无法弄清楚如何等待 Promise

我有一个包含用户 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)

我希望响应等待循环完成并发送用户数组。


潇湘沐
浏览 412回答 3
3回答

侃侃尔雅

首先,您需要在运行之前等待所有承诺完成 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 blockPromise.all([           users = [   getUser(10),    ->     {userId: 10, ....}   getUser(11),    ->     {userId: 11, ....}   getUser(12)     ->     {userId: 12, ....}])                      ]*/

茅侃侃

作为替代答案,以下是您如何针对此特定查询对数据库进行 1 次旅行,这意味着您无需等待多个 Promise 并减少数据库的负载knex.raw(  'select name from users where user_id in (' + userId.map(_ => '?').join(',') + ')',   [...userId]);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript