node.js - Coinbase API 响应大且速度慢
问题描述
以下代码需要 5 到 10 秒才能解决(有 5 个 API 调用)。它不能按原样使用。响应缓慢是我的错,还是 Coinbase API 又慢又大?
app.get('/buys', async (req, res) => {
const buys = await getAllBuys()
res.json(buys)
})
const fetchAllAccounts = () => {
return new Promise(
(resolve, reject) => {
coinbase.getAccounts(null, (err, accounts) => {
if (err) {
reject(err)
}
else{
resolve(accounts)
}
})
}
)
}
const fetchAllBuys = (account) => {
return new Promise(
(resolve, reject) => {
account.getBuys(null, (err, buys) => {
if (err) {
reject(err)
}
else{
resolve(buys)
}
})
}
)
}
const getAllBuys = async () => {
const accounts = await fetchAllAccounts()
let combinedBuys = []
for (let account of accounts) {
const buys = await fetchAllBuys(account)
combinedBuys = [...combinedBuys, ...buys]
}
//console.log(combinedBuys)
return combinedBuys
}
响应是一个数组,其中包含包括证书等帐户信息的项目。
解决方案
好的,所以这是我的代码。在上面的代码中,我等待每个请求完成,然后再启动一个新请求。这会导致不必要的延迟。使用该Promise.all
方法,我们可以生成所有的 Promise 并同时解决它们。看看下面重构的代码。
app.get('/buys', async (req, res) => {
console.time('[/buys]');
const promises = await getAllBuys()
const buys = await Promise.all(promises)
res.json(buys)
console.timeEnd('[/buys]');
})
const fetchAllAccounts = () => {
return new Promise(
(resolve, reject) => {
coinbase.getAccounts(null, (err, accounts) => {
if (err) {
reject(err)
}
else{
resolve(accounts)
}
})
}
)
}
const fetchAllBuys = (account) => {
return new Promise(
(resolve, reject) => {
account.getBuys(null, (err, buys) => {
if (err) {
reject(err)
}
else{
resolve(buys)
}
})
}
)
}
const getAllBuys = async () => {
const accounts = await fetchAllAccounts()
let promises = []
for (let account of accounts) {
promises.push(fetchAllBuys(account))
}
return promises
}
从 2,5 / 3 秒到 0,8 / 1 秒。
推荐阅读
- python - Scikit 学习多元线性回归和多项式特征的系数顺序
- python - 使用底图和 matplotlib 对某个国家/地区的某些城市进行彩色绘图
- discord - 如果消息包含不和谐 py 的表情符号,如何检查 on_message?
- c - if 语句中的多个条件如何工作
- android - Arraylist 在 android 中为空检查
- maven - 为什么我不能将 aar 文件添加到我们的库项目并在没有 aar 的情况下分发它?
- c# - C#热身基础练习
- javascript - 如何打开本地 Excel 工作表以在电子中单击按钮进行编辑?
- python - 如何修复 ValueError:未发现的数据仍然存在:在日期时间转换中(来自 json) - Flask?
- c# - 从开始到结束的所有数字都将添加到列表框 C#