【问题标题】:Make a single HTTP request from multiple invocations从多个调用发出单个 HTTP 请求
【发布时间】: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


【解决方案1】:

您可以缓存从getPrice() 返回的承诺,并让每个在特定时间窗口内调用它的请求都获得相同的承诺。这将处理第二次调用getPrice() 在第一次调用完成之前进入的情况。第二个只会得到第一个已经在等待的承诺,因此它们将共享相同的结果并且只会发出一个请求。

这里有一个实现:How to have multiple requests for the same data share the same result and request

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 2016-03-29
    • 2017-02-27
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多