Javascript 更新带有属性问题的数组列表

Javascript 更新带有属性问题的数组列表,javascript,arrays,object,ecmascript-6,promise,Javascript,Arrays,Object,Ecmascript 6,Promise,我正在尝试更新userList中用户的数组列表。。。如果userDetails.length不为零,则具有名为valid的属性 但是用户列表永远不会更新 userList.map(async function(user) { let userId = user.id await db.queryUser(userId) .then(function(userDetails){ if(userDetails.length !== 0){

我正在尝试更新
userList
中用户的数组列表。。。如果
userDetails.length
不为零,则具有名为valid的属性

但是用户列表永远不会更新

userList.map(async function(user) {
    let userId = user.id
    await db.queryUser(userId)
      .then(function(userDetails){
        if(userDetails.length !== 0){
          user.valid = true;
        }
    });
});
我试着这样做:

let filteredList = userList.map(async function(user) {
    let userId = user.id
    await db.queryUser(userId)
      .then(function(userDetails){
        if(userDetails.length !== 0){
          user.valid = true;
        }
    });
});
但这一承诺尚未兑现。有更好的办法吗

更新

使用以下代码使其正常工作:

await Promise.all(userList.map(async function(user) {
    let userId = user.id
    await db.queryUser(userId)
      .then(function(userDetails){
        if(userDetails.length !== 0){
          user.valid = true;
        }
    });
  })
)

承诺是悬而未决的,因为你从不等待它们。你只是在创建一张承诺地图

如果要就地更新用户,则不需要地图:

for(让用户使用userList){
const userDetails=wait db.queryUser(user.id);
如果(userDetauls.length)user.valid=true;
}
(假设外部函数是异步的,否则使用
。然后
而不是
等待

更新 然而,这将以串行方式执行查询。也许你想让它们并行运行

在这种情况下,您可能希望实际执行映射,但随后使用
Promise.all
等待承诺


类似这样的内容:
等待Promise.all(userList.map(…)

好吧,看起来您正在尝试使用async/await语法和.then语法,而不是替代它。调用queryUser函数时,请尝试将响应存储到变量userDetails中,然后检查长度,如下所示:

let filteredList = userList.map(async function(user) {
    let userId = user.id
    let userDetails = await db.queryUser(userId)

    if(userDetails.length !== 0){
          user.valid = true;
        }
});

用户有时返回int而不是对象。。。但是该对象确实存在于userList中,并且可以很好地打印。为什么会这样?你说的“用户返回int”是什么意思?有时是什么?什么时候你说的是for…of loop?我知道了。谢谢最后一个问题,我是否应该使用wait with Promise.all()并在其中调用Promise?请参阅我对问题的编辑
wait
只是
的一些语法糖。然后
,因此您只需要两个选项中的一个。您可以编写
constuserdetail=wait db.queryUser()
db.queryUser()。然后(userDetail=>…)
,两者都可以工作。如果您确实
wait db.queryUser().then(…)
,它也会起作用,因为
then
也会返回一个承诺,但这是不必要的。关于
Promise.all
:它返回一个承诺。您需要等待它解决,这就是为什么您需要等待它或使用它。因此,如果您想使用wait或then,则由您自己决定,但有一个例外:您只能在
async
函数中使用
wait
。还有一件事:如果
map
不更新用户会更好,这是一个令人惊讶的副作用(比如调用getSomething()会更新某些内容,这是您所预料不到的)。也许您应该首先加载userDetails,比如
constuserdetails=wait Promise.all(userList.map(user=>db.queryUser(user))
,然后才使用userDetails更新用户。请注意,map函数现在不需要异步加载,它只是从queryUser返回承诺。