前端请求的timeout设置

  1. Reference

当我们发出一个网络请求,但是没有做超时设置,一个隐含的假设是我们认为这个请求一定会成功。然而,我们无法做出请求一定会成功的保证的。

  • 当你发出的同步请求从没有返回的时候,线程会一直被占用的
  • 异步请求未返回的线程也无法继续复用,因为sockets会有泄露,socket池的容量是有限的,未返回结果的线程会一直开着连接,最终可能会导致连接的短缺

因此best practice应当是对于ajax请求,做好timeout的设置,因为XMLHttpRequest的默认timeout是0,即没有超时设置。

Client端的timeout设置和server端一样重要,浏览器可以开的socket的数量也是有限的,我们应该通过设置timeout来充分利用socket pool。Fetch API是当前比较流行的XMLHttpRequest API的替代品,然而现在还没有一个直接的设置timeout的方法,最近刚刚推出了abort API,可以用来支持timeout。

用法比如:

const controller = new AbortController();

const signal = controller.signal;

const fetchPromise = fetch(url, {signal});  

// No timeout by default!
setTimeout(() => controller.abort(), 10000); 

而对于Jquery的ajax call,我们可以使用:

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

Reference

https://robertovitillo.com/default-timeouts/


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com

文章标题:前端请求的timeout设置

文章字数:336

本文作者:Leilei Chen

发布时间:2020-09-18, 12:09:01

最后更新:2020-09-18, 12:09:42

原始链接:https://www.llchen60.com/%E5%89%8D%E7%AB%AF%E8%AF%B7%E6%B1%82%E7%9A%84timeout%E8%AE%BE%E7%BD%AE/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏