我是 JS 新手,我不知道如何实现这一目标。我有一个像这样的 JS 对象:
{ 'U9B6QVB9B': 26, 'U2B2HKB5H': 23, 'U4Q7S4JTB': 41 }
我想将 Slack API 中的异步函数应用于每个键(代表 Slack 用户的 ID),以获取用户名。第一次尝试是这样的:
var userIdToName = function(cuenta){
var cuentaF = {};
for (var key in cuenta){
slack.users.info({token, key}, function(err, data){
var nombre = data.user.name;
cuentaF[nombre] = cuenta[key];
})
}
return cuentaF;
}
但现在,我知道这是不可能的,因为“var key”更改了其值,并且循环在第一个异步调用结束之前结束。我一直在阅读有关 Promises 以及其他 JS 和 Node 工具的内容,但直到现在我还无法想象如何使用它们来实现它。
提前致谢。
注意:我使用的是 NodeJS v4.6.0,但如果有必要,我可以将其更改为其他版本。
最佳答案
如果你可以让slack.users.info
返回一个promise,你可以这样做:
const promises = Object.keys(cuenta)
.map(key => slack.users.info({ token, key });
Promise.all(promises)
// turn promises back into object
.then(results => results.reduce(
(cuentaF, currentResult, i) => Object.assign({}, cuentaF, {
[Object.keys(cuenta)[i]]: currentResult
}),
// starting point
{}
))
如果 slack 不能给你 promise ,你可以创建自己的函数来返回这样的 promise
function getSlackInfo(key) {
return new Promise((resolve, reject) => slack.users.info({ token, key }, (err, result) => {
if (err) { reject(err); }
else { resolve(result); }
})
}
关于javascript - 如何对 JS 对象中的每个键应用异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44988737/