javascript - 如何等待 Promise 解决后再返回值?

标签 javascript callback promise asynccallback

我正在尝试编写一个函数,该函数在函数内的 Promise 解决之前不会返回其值。这是我正在尝试做的事情的一个简化示例。

'use strict';

function get(db, id) {
     let p = db.command('GET', 'group:${id}');
     p.then(g => {
         g.memberNames = [];
         g.members.forEach(id => {
             User.get(db, id)
                 .then(profile => g.memberNames.push(profile.name))
                 .catch(err => reject(err));
         });
         return g;
    });
}

这是一个请求组 ID 并返回该组数据的函数。在此过程中,它还将用户的姓名放入数据结构中以显示他们的姓名而不是用户 ID。我的问题是,这是异步运行的,并且会跳过 .then 回调。当它返回 g 时,还没有调用任何回调,并且 g.memberNames 仍然为空。有没有办法让函数等待返回 g 直到调用所有回调?

我见过很多关于await的东西。这里有必要这样做吗?非常不希望将其他库添加到我的项目中。

最佳答案

由于返回所有配置文件名称的操作也是异步的,因此当所有其他异步操作完成时(或当其中一个操作被拒绝时拒绝),您应该返回一个已完成的 Promise Promise.all

function get(db, id) {
  let p = db.command('GET', 'group:${id}');
  return p.then(g => {
    return Promise.all(g.members.map(id => {
      // NOTE: id is shadowing the outer function id parameter
      return User.get(db, id).then(profile => profile.name)
    })
  })
}

关于javascript - 如何等待 Promise 解决后再返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37799592/

相关文章:

node.js - 如何在 Aws Lambda 中将 watson Assistant v2 与 Amazon Skill Kit 连接?

javascript - 为什么sequelize.findOne() 没有返回结果,而我可以看到结果在我的数据库中

javascript - Chrome 扩展程序 : Getting html of page before page renders/loads

javascript - Angular Material 的 md-nav-bar 无法与 ui-router 一起正常工作

javascript - 从 Javascript、Ajax、IE : can responseBody be read from Javascript (not VB)? 访问二进制数据

kotlin - 网络调用后,如何将数据从 Android 库传递到我的应用程序?

function - 处理库中回调的推荐方法

javascript - jQuery 仅序列化表单的一部分

c# - 从 HttpWebRequest.BeginGetResponse 回调获取数据

各种 Promises 实现中失败 `reason` 的 typescript 类型?