我正在尝试编写一个函数,该函数在函数内的 Promise 解决之前不会返回其值。这是我正在尝试做的事情的一个简化示例。
'use strict';
function get(db, id) {
let p = db.command('GET', 'group:${id}');
p.then(g => {
g.memberNames = [];
g.members.forEach(id => {
User.get(db, id)
.then(profile => g.memberNames.push(profile.name))
.catch(err => reject(err));
});
return g;
});
}
这是一个请求组 ID 并返回该组数据的函数。在此过程中,它还将用户的姓名放入数据结构中以显示他们的姓名而不是用户 ID。我的问题是,这是异步运行的,并且会跳过 .then 回调。当它返回 g 时,还没有调用任何回调,并且 g.memberNames
仍然为空。有没有办法让函数等待返回 g 直到调用所有回调?
我见过很多关于await的东西。这里有必要这样做吗?非常不希望将其他库添加到我的项目中。
最佳答案
由于返回所有配置文件名称的操作也是异步的,因此当所有其他异步操作完成时(或当其中一个操作被拒绝时拒绝),您应该返回一个已完成的 Promise Promise.all
。
function get(db, id) {
let p = db.command('GET', 'group:${id}');
return p.then(g => {
return Promise.all(g.members.map(id => {
// NOTE: id is shadowing the outer function id parameter
return User.get(db, id).then(profile => profile.name)
})
})
}
关于javascript - 如何等待 Promise 解决后再返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37799592/