【发布时间】:2020-07-22 20:39:23
【问题描述】:
我正在调用一个批处理请求,该请求为返回的每个 项调用回调。
const getBalances = async (addresses, callback) => {
const decimals = await contract.methods.decimals().call();
const batch = new web3.BatchRequest();
for (let address of addresses)
batch.add(
contract.methods
.balanceOf(address)
.call.request(
{ from: "0x0000000000000000000000000000000000000000" },
(err, balance) => {
if (err) callback(err);
balance = balance / 10 ** decimals;
callback(undefined, balance);
}
)
);
batch.execute();
};
批处理请求返回的每个项目都会调用以下回调,因此此回调会为address1 调用一次,为address2 调用一次。
getBalances([address1, address2], async (err, balance) => {
if (err) throw new Error()
if (balance < 100) return
const price = await getPrice() // getPrice() triggers a GET request
// use price to do additional processing
}
如果任一回调返回余额 >= 100,我需要发出 GET 请求以进行更多处理,但不能抢先发出此请求,因为两个回调可能返回 getPrice()不需要。
const getPrice = () => {
const { price } = await axios.get(url)
return price
}
如果两个回调都返回 > 100 的余额,则调用 getPrice() 将发出一个冗余请求。为多次调用调用异步函数 (getPrice()) 一次 的正确方法是什么,所以第一次调用会发出 HTTP 请求,而所有其他调用都会收到单个请求响应的通知?
【问题讨论】:
-
我不明白问题的结构。
getPrice()可以在一个 GET 请求中请求多个价格值吗?或者,您是否只需要缓存来阻止请求您最近请求的价格? -
正是后者,每个回调的调用都可以通过单个响应来通知。
-
另外,什么被多次调用?回调?什么叫它,为什么?你没有在这里展示你真正想要完成的事情,所以这个问题非常抽象,这可能就是为什么它很难理解。这里的最终目标是什么?
-
你尝试过承诺吗?
-
如果你要实现一个缓存,它可能在
getPrice()内部,所以我们想看看那个代码。
标签: javascript node.js