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

时间:2017-07-08 17:07:45

标签: javascript node.js asynchronous

我是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,但如果有必要,我可以将其更改为其他版本。

1 个答案:

答案 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); }
   })
 }