承诺中的 Express 路由器调用 - React - Redux



我在将 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 匹配的帐户。

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

我对这个函数的想法是返回一个承诺,即返回客户端,然后让承诺中的烦人函数返回添加了余额的新帐户对象。

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

这是我的思路...

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

找到了一种方法让它工作。只需要调整我的 .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));
}
);

最新更新