【问题标题】:Promise within a promise for Express Router call - React - Redux快速路由器调用的承诺中的承诺 - React - Redux
【发布时间】:2019-04-01 08:49:16
【问题描述】:

我在将我的 api 调用链接在一起时遇到困难,这样一个调用就不会在另一个之前完成。

我想从第一个 api 查询指定给用户的所有账户,然后我想获取返回的账户数组并从另一个数据库查询他们的账户余额。最后,将余额添加到他们的帐户对象和 res.json(帐户数组)。

我遇到的问题是查找帐户的查询没有等待添加余额的查询完成,并且所有余额都以未定义的形式发送到我的状态。我在两个查询中使用 console.log() 发现了这一点(下面未显示)。

我对来自 api 调用的承诺相对较新,所以我不确定最好的方法是什么。我对下面的承诺的 .all 表示法没有任何运气,我不确定这是否是最好的方法,因为第一次 API 调用可能会返回多个帐户。

这是查询帐户的第一个 API 调用。

router.get(
  "/accounts",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    Account.find({ userId: req.user.id })
      .then(accounts => {
        return accounts.map((account) => addBalanceToAccount(account));
      }).all( (ret) => {
          // NOT SURE WHAT TO DO HERE
          ret.then((value) => console.log(value));
          res.json(ret)
      })
      .catch(err => console.log(err));
  }
);

第二个 api 调用在 addBalanceToAccount(account) 函数中。 基本上我使用 ACCESS_TOKEN 来查询数据库。 ACCESS_TOKEN 可以绑定到多个帐户,因此我将它们过滤为仅与帐户 ID 匹配的帐户。

有时银行会返回错误对象而不是余额,因此在这种情况下会导致 value === undefined。

我对这个函数的想法是返回一个promise,即返回客户端,然后让promise中的annoymous函数返回带有余额的新帐户对象。

function addBalanceToAccount(account){
  ACCESS_TOKEN = account.accessToken;
  let value;
  let accountFound;

  return client
    .getBalance(ACCESS_TOKEN)
    .then(response => {
        accountFound = response.accounts.filter((a) => a.account_id === account.accountId);
        value = accountFound.length > 0 ? accountFound[0].balances.current : -2;
        return value === undefined ? {...account, balance: -1} : {...account, balance: value}
    })
    .catch(err => {console.log("ERROR"); return {...account, balance: -3};});
}

这是我的思路……

返回的 accounts.map() 应该返回一个 Promise 数组,这就是我使用 .all() 的原因。然后在 .all() 中,我应该能够等待所有帐户查询其余额。最后 res.json() 应该返回一个账户对象数组,其中包含一个键 {balance: value}

【问题讨论】:

    标签: express promise react-redux


    【解决方案1】:

    找到了让它工作的方法。只需要调整我的 .all() 调用:)

    router.get(
      "/accounts",
      passport.authenticate("jwt", { session: false }),
      (req, res) => {
        Account.find({ userId: req.user.id })
          .then(accounts => {
            Promise.all(accounts.map((account) => addBalanceToAccount(account)))
              .then((accountList) => res.json(accountList))
          })
          .catch(err => console.log(err));
      }
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 2018-06-23
      • 2018-12-28
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      相关资源
      最近更新 更多