是否可以有多个未完成的异步请求?

时间:2019-06-25 13:35:47

标签: javascript asynchronous

想象一个网格。当用户填写A1单元格并按Enter进入A2时,将向后端发出请求以在数据库中查找内容,然后将查找结果返回至前端以填充A行的其余部分- -同时,我希望用户能够继续输入A2,A3等。
所以问题是:

  • 您是否可以触发多个未完成的异步请求 即使先前请求的结果又一次出现
    还没有解决吗?还是每个随之而来的异步请求
    以某种方式取消了先前的请求?
  • 我要访问的数据库是公司数据仓库-我 想象它极其缓慢。异步有多长时间没有限制 请求可以保持“开放”?浏览器会超时吗?
  • 最后,可以说我正在发送异步请求#1,#2和
    #3-但他们以#2,#3,#1的顺序得到了答复-在那儿 有什么影响吗?

谢谢

3 个答案:

答案 0 :(得分:2)

按顺序回答您的问题:

  1. 是的,您绝对可以同时拥有多个HTTP requests。考虑网页的示例。当您打开任何网页时,多个请求将发送到多个位置。解决这些问题后,在其上定义的callback methods会不断填充网页上的数据。

  2. 是的,当然可以。一段时间后,该请求将timeout。每个浏览器都有一个default timeout duration,它将为此打开请求。达到该超时时间后,它将取消请求。

  3. 解决顺序无关紧要。您将使用基于callback的方法来读取HTTP response。每个回调方法将特定于该HTTP request,并应自行处理。

答案 1 :(得分:2)

  

您是否可以有多个未完成的异步请求,这些请求又一次触发,即使先前请求的结果   还没有解决?

是的

  

还是每个随后的异步请求   以某种方式取消了先前的请求?

否。

  

我要访问的数据库是公司数据仓库-我认为它的运行速度非常慢。异步请求可以保持“打开”状态有多长时间?浏览器会超时吗?

是的,请求最终将超时。 (但我不认为公司数据仓库中的数据库“非常慢”。)

  

最后,可以说我正在发送异步请求#1,#2和#3-但它们以#2,#3,#1的顺序得到了答复-对此有任何影响吗? / p>

使用大多数API(XMLHttpRequestfetch等),您将按照操作完成的顺序而不是操作开始的顺序,如果您的代码未设置为可以处理的话,确实可能会产生后果。


例如,此代码在jsFiddle上显示了三个重叠的未完成请求,它们以随机顺序完成:

function doRequest(reqnum, reqdata) {
    const delay = (1000 + Math.floor(Math.random() * 3000)) / 1000;
    const json = JSON.stringify({data: reqdata});
    return fetch("/echo/json/", {
        method: "POST",
        body: `delay=${delay}&json=${encodeURIComponent(json)}`
    })
    .then(res => {
        if (!res.ok) {
            throw new Error("HTTP status " + res.status);
        }
        return res.json();
    })
    .then(data => {
        console.log(`${reqnum} complete, data = ${data.data}`);
    });
}

doRequest(1, "one");
doRequest(2, "two");
doRequest(3, "three");

Live Example

答案 2 :(得分:0)

是的,您可能有多个未完成的异步请求。 JavaScript并不是真正暗示的单线程。使用睡眠功能时很常见。

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

继续,尝试睡眠功能,并在第一个请求解决之前多次调用它。确保您的功能是异步的。

请注意宿醉错误。多次调用一个函数不会拒绝先前的请求。可以在此处的工作示例中看到:https://codepen.io/anon/pen/Jmpcq/?editors=101

超时最终会发生。