Javascript 如何对JS对象中的每个键应用异步调用?

Javascript 如何对JS对象中的每个键应用异步调用?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我是JS新手,我不知道该怎么做。我有一个JS对象,如下所示: { 'U9B6QVB9B': 26, 'U2B2HKB5H': 23, 'U4Q7S4JTB': 41 } var userIdToName = function(cuenta){ var cuentaF = {}; for (var key in cuenta){ slack.users.info({token, key}, function(err, data){

我是JS新手,我不知道该怎么做。我有一个JS对象,如下所示:

{ 'U9B6QVB9B': 26, 'U2B2HKB5H': 23, 'U4Q7S4JTB': 41 }
    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;

    }
我想将slackapi中的异步函数应用于每个键(表示Slack用户的ID),以获取用户名。第一次尝试是这样的:

{ 'U9B6QVB9B': 26, 'U2B2HKB5H': 23, 'U4Q7S4JTB': 41 }
    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
以返回承诺,您可以执行以下操作:

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不给您承诺,您可以创建自己的函数,返回这样的承诺

 function getSlackInfo(key) {
   return new Promise((resolve, reject) => slack.users.info({ token, key }, (err, result) => {
     if (err) { reject(err); }
     else { resolve(result); }
   })
 }

令牌、密钥是什么意思?它的无效syntaxkey是“for in”循环中使用的迭代变量,它是每对对象的密钥。token是一个全局变量,用于连接到Slack bot。语法是因为我正在使用这个包:这可能是我需要的,所以非常感谢。但我对“然后”部分有点困惑。你能给我解释一下它的作用吗?我应该在哪里或如何使用最终对象“cuentaF”?再次感谢!每个承诺都有一个
。然后
方法。它基本上允许您访问某个异步操作的结果。同时,它还允许你传递承诺。承诺就像一张电影票。这不是电影本身,只是一个让你看电影的承诺。要获得电影,您需要
。然后
要获得
cuentaF
您需要添加另一个
。然后
像这样添加到链中:
。然后(result=>dowhatever(result))就是这样!!非常感谢!!:D