当前位置: 首页 > 知识库问答 >
问题:

用Javascript函数更有效地处理并发异步函数

苏选
2023-03-14

考虑以下几点:

  • 每秒最多可有100个并发请求的web应用程序
  • 当前每个传入请求都向endpoint发出http请求以获取某些数据(最多需要5秒)
  • 我只想发出一次http请求,也就是说,我不想对同一个endpoint进行并发调用,因为它将返回相同的数据
  • 这个想法是,只有第一个请求才会进行http调用以获取数据
  • 而此呼叫是“飞行”,随后的请求将不会发出相同的呼叫,而是“等待”第一个飞行请求完成。
  • 当对数据的初始http请求已经响应时,它必须响应所有使用数据的调用。
  • 我将Bluebirdpromise用于执行http请求的异步函数。

共有1个答案

鄢承运
2023-03-14

一个web应用程序只能有6个并发请求,因为这是浏览器的严格限制。较老的IE只能做2个。所以不管你做什么--这是一个硬性的限制。

通常,您应该解决服务器端的多路复用。

现在--对于您的实际问题--您所要求的那种缓存与promise非常简单。

function once(fn) {
    var val = null; // cache starts as empty
    return () => val || (val = fn()); // return value or set it.
}


var get = once(getData);
get();
get(); // same call, even though the value didn't change.
function once(fn, timeout) {
  var val = null, timer = null; // cache starts as empty
  return () => val || (val = fn().tap(invalidate)); // return value and invalidate
  function invalidate() { 
    clearTimeout(timer); // remove timer.
    timer = setTimeout(() => val = null, timeout);
  }
}

var get = once(getData, 10000); 
function once(fn, timeout) {
  var val = null, timer = null; // cache starts as empty
  return () => val || 
   (val = fn().catch(e => value = null, Promise.reject(e)).tap(invalidate));
  function invalidate() { 
    clearTimeout(timer); // remove timer.
    timer = setTimeout(() => val = null, timeout);
  }
}

因为最初的功能是一行代码,所以没有帮助器。

 类似资料:
  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 问题内容: 现在,我有几次遇到使用Firebase的同步和异步功能的问题。我的问题通常是我需要在我编写的函数中进行异步Firebase调用。作为一个简单的示例,假设我需要计算并显示对象的速度,而我的Firebase存储距离和时间: 当然,上述代码将无法使用,因为它是异步调用,因此在到达时尚未设置。如果我们将内部放置在回调函数中,则什么也不会返回。 一种解决方案是使我的函数也异步。 另一种解决方案是

  • 我在Sequelize的节点8上。js 当尝试使用时,出现以下错误。 代码: 获取以下错误: 我做错了什么?

  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 我在中写了这段代码 然后我尝试在另一个文件中使用它 我得到一个错误 “等待仅在异步函数中有效” 问题是什么?

  • 我正在尝试设置一些数据在使用这个节点js代码的FIRESTAR: 在控制台中运行文件: 给我这个错误: 如何解决这个问题