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

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

最佳答案

如果你可以让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/

相关文章:

javascript - 在 HTML 小部件中横向滚动

javascript - Handlebars js : where to download very last version?

c# - 发送参数后异步等待事件

javascript - 使用 "this": "TypeError: Cannot read property ' renderElapsedString' of undefined"导入函数并获取 props

javascript - 在 View 之间传递值 MVC5

node.js - tsc 后来自 tsconfig.json 的路径不起作用

node.js - grunt uglify 在父目录中找不到我的文件

node.js - 跟踪 Node.js 程序执行

javascript - 处理 Node 的异步特性 - writeFile 回调

c++ - 从多个文件描述符异步接收 UDP 数据包