我是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,但如果有必要,我可以将其更改为其他版本。
答案 0 :(得分:1)
如果你能让slack.users.info
返回一个承诺,你可以这样做:
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
{}
))
如果懒散不会给你许诺,你可以自己创造一个像这样的承诺的函数
function getSlackInfo(key) {
return new Promise((resolve, reject) => slack.users.info({ token, key }, (err, result) => {
if (err) { reject(err); }
else { resolve(result); }
})
}