Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不知道如何等待承诺_Javascript_Node.js_Knex.js - Fatal编程技术网

Javascript 不知道如何等待承诺

Javascript 不知道如何等待承诺,javascript,node.js,knex.js,Javascript,Node.js,Knex.js,我有一个带有用户ID的数组,我需要找出每个ID所属的名称,并在数组中返回它们。 我可以使用knex从数据库中获取用户名,并将其放入一个数组中,但当我尝试发送数据时,它总是一个空数组 我不太擅长承诺,所以不知道如何应用到我的项目中 const userId = [10,11,12,13] let users = [] userId.map(id => { db.select('name').from('users').where('user_id', id) .then(u

我有一个带有用户ID的数组,我需要找出每个ID所属的名称,并在数组中返回它们。 我可以使用knex从数据库中获取用户名,并将其放入一个数组中,但当我尝试发送数据时,它总是一个空数组

我不太擅长承诺,所以不知道如何应用到我的项目中

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)

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

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

其次,在promise解析后,不应该对外部变量进行变异,因为promise解析的顺序将改变您的输出,这是不好的

像这样的东西应该行得通

const userId=[10,11,12,13] //将userId数组映射到promise数组 //all将一个Promise数组聚合为一个大Promise,当所有Promise都解析并保持数组顺序时,该大Promise将解析 我保证 userId.mapid=> 分贝 .选择姓名 .来自用户 .whereuser_id,id .thenusers=>res.jsonusers .catch=>console.errorError:,e; /*catch块中的句柄错误*/ /*Promise.all.then块的可视示例 承诺。所有[用户=[ getUser10,->{userId:10,…..} getUser11,->{userId:11,…..} getUser12->{userId:12,…..} ] ] */
首先,您需要等待所有承诺完成后再运行res.json

其次,在promise解析后,不应该对外部变量进行变异,因为promise解析的顺序将改变您的输出,这是不好的

像这样的东西应该行得通

const userId=[10,11,12,13] //将userId数组映射到promise数组 //all将一个Promise数组聚合为一个大Promise,当所有Promise都解析并保持数组顺序时,该大Promise将解析 我保证 userId.mapid=> 分贝 .选择姓名 .来自用户 .whereuser_id,id .thenusers=>res.jsonusers .catch=>console.errorError:,e; /*catch块中的句柄错误*/ /*Promise.all.then块的可视示例 承诺。所有[用户=[ getUser10,->{userId:10,…..} getUser11,->{userId:11,…..} getUser12->{userId:12,…..} ] ] */ 您的映射正在创建一个未定义的数组,因为回调函数不返回任何内容。如果我们稍微调整一下,它将创建一系列承诺,这正是我们所期望的:因此:

const userId = [10,11,12,13]
Promise.all(
    userId.map(id => db.select('name').from('users').where('user_id', id))
)
.then(users => {    // `users` is an array of users, in the same order as the IDs
    res.json(users);
})
.catch(error => {
    // Render an error response
});
您的映射正在创建一个未定义的数组,因为回调函数不返回任何内容。如果我们稍微调整一下,它将创建一系列承诺,这正是我们所期望的:因此:

const userId = [10,11,12,13]
Promise.all(
    userId.map(id => db.select('name').from('users').where('user_id', id))
)
.then(users => {    // `users` is an array of users, in the same order as the IDs
    res.json(users);
})
.catch(error => {
    // Render an error response
});

作为一个备选答案,您可以为这个特定的查询访问数据库一次,这意味着您不需要等待多个承诺并减少数据库的负载

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

作为一个备选答案,您可以为这个特定的查询访问数据库一次,这意味着您不需要等待多个承诺并减少数据库的负载

knex.raw(
  'select name from users where user_id in (' + userId.map(_ => '?').join(',') + ')', 
  [...userId]
);
你要承诺,一切,看

试一试

这里是一系列的承诺。一旦所有问题都得到解决,请立即执行res.jsonusers。

您需要Promise.all,请参阅

试一试


这里是一系列的承诺。一旦所有这些问题都解决了,请立即执行res.jsonusers。

我可以帮助您使用ans,但请相信我,开始阅读关于await/async的内容,并承诺尝试此方法。一个好的开发人员始终阅读我可以帮助您使用ans,但请相信我,开始阅读关于await/async的内容,承诺尝试这一点一个好的开发人员总是读到返回是无用的,可能会让用户感到困惑OP@JonasWilms根据环境的不同,有些人要求返回承诺,因此不会挂起请求,例如firebase函数,但您是对的,习惯。这种回报是无用的,可能会让客户感到困惑OP@JonasWilms根据环境的不同,有些人要求返回承诺,这样就不会挂起请求,例如firebase功能,但您是对的。