精华内容
下载资源
问答
  • 利用promise实现一个超时请求处理

    千次阅读 多人点赞 2021-03-27 15:15:38
    我第一个想法竟然是:嘶~这问题挺简单的啊,不就是用 Date 对象判断是否大于某个时间差么?于是写出了下面这段代码: let rest=function(){ // 开始是放在外面的,但是面试官说要尽可能不单独暴露值,于是鬼迷心窍...

    今天面试官问的我这个问题,说实话,我当时懵逼了。
    我第一个想法竟然是:嘶~这问题挺简单的啊,不就是用 Date 对象判断是否大于某个时间差么?于是写出了下面这段代码:

    let rest=function(){
    	// 开始是放在外面的,但是面试官说要尽可能不单独暴露值,于是鬼迷心窍(紧张)杀都没想就直接扔进来了...
    	let date=Date.now();
    	return new Promise((resolve,reject)=>{
    		let _date=Date.now();
    		if(_date-date>2000){
    			reject('请求超时');
    		}
    		resolve();
    	})
    }
    

    在我暗自得意是不是快结束了面试官一会儿会如何告诉我面试通过了的时候,对面突然传来一句话:
    “你这个,确定要这样?”
    “你这样if条件真的会执行么?”
    what!
    我顿时感觉大事不妙大惊失色,正要仔细看时面试官已经说出了“行吧,这道题你再想想,这次的面试就到这里吧”

    下来后仔细想想,“基于promise”的前提就已经提示了应该要“尽可能地应用promise的特性”,那么,这个问题应该用什么呢?

    我想起了前两天写过的这篇文章:实现一个“能中断的”ajax 。里面提到了可以用 “ reject抢跑 ”的方法去中止后续回调的执行!

    这里要记得一点:promise状态值改变一旦触发就不可逆,所以不可能真正“中断”promise,只能说通过同步与异步的先后规则(event Loop)去让“成功”的回调无法执行。

    我似乎恍然大悟了起来…

    但现在还有一个问题:怎么判断“超时”?
    如果不出意外,你把两个 Date 放在一个函数中无论如何它们的值都是相同的!所以我想到了 setTimeout !有了这个异步时间处理,我的思路就明朗了起来:在promise中有一个API叫:Promise.race() ,和 all() 不同的是,race在其中promise状态值有一个改变时就会立刻执行它的结果,就像这样:

    let rest=function(_data=1000){
    	return Promise.race([
    		upload().then(data=>{console.log(data.data)}),
    		uploadTimeout(_data)
    	])
    }
    function upload(){
    	console.log('请求进行中...');
    	return new Promise((resolve,reject)=>{
    		let xhr=new XMLHttpRequest();
    		xhr.open('GET',"https://devapi.qweather.com/v7/weather/24h?location=这里是纬度和经度英文逗号分搁&key=这里是百度地图的key");
    		xhr.onload=function(){
    			if(xhr.readyState==4 && (xhr.status>=200 && xhr.status<300)){
    				setTimeout(()=>{
    					resolve({data:JSON.parse(xhr.responseText)})
    				},2000)
    			}else{
    				reject(xhr.status)
    			}
    		}
    		xhr.onerror=function(){
    			reject('请求失败了...')
    		}
    		xhr.send(null);
    		// 【1】
    	})
    };
    function uploadTimeout(times){
    	return new Promise((resolve,reject)=>{
    		setTimeout(()=>{
    			reject('请求超时,请重试');   // 【2】
    		},times)
    	})
    }
    

    到这里,基本实现了功能,但是运行后你会发现:第一个函数在报错后仍然执行了!
    对,这就是上面说的:promise状态值改变的过程是不可逆的。而且虽然你下面返回了reject,但是这是两个promise,之间是不冲突的!

    受上面说过的 reject抢跑 的启发,我们可以在代码中标注为【1】的地方写这样的代码:

    // 向外暴露取消函数
    cancelFn=function(msg){
    	reject('请求超时,请重试');
    }
    

    然后将代码中标注为【2】的地方的代码替换为:

    cancelFn();
    

    至此,一个“超时请求处理”的功能就真的实现了:
    view


    重新研究了promise源码,发现一件事:文档上描述的“Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。”其实并没有说完整,这样的描述其实很容易带给开发者一个想法:race在第一个promise执行结束时就会return(不再执行其他的promise了)。但是如上面所说,promise过程不可逆不可中断,那么已经开始执行的promise怎么办呢?

    如果按上面代码中这样写,而且最后没有添加cancelFn函数,就会出现如下情况:
    test

    既报了错,又返回了执行完成的结果。
    这显然不符合实际场景!

    查阅文档发现,MDN是这样解释的:

    race 函数返回一个 Promise,它将与第一个传递的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。
    如果传的迭代是空的,则返回的 promise 将永远等待。
    如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。

    根据描述即猜想,我们不难模拟出 promise.race 的实现:

    Promise.Myrace=function(promises){
    	promises=Array.from(promises);
    	return new Promise((resolve,reject)=>{
    		if(promises.length===0){
    			resolve([]);
    		}else{
    			for(let i=0;i<promises.length;i++){
    				Promise.resolve(promises[i]).then(data=>{
    					resolve(data);
    					return;
    				},err=>{
    					reject(err);
    					return;
    				})
    			}
    		}
    	})
    }
    

    所以,我们可以将上面实现超时处理的代码中第2-5行改为这样,并可以去掉cancelFn函数的声明和调用:

    return Promise.Myrace([
    	upload(),
    	uploadTimeout(_data)
    ])
    .then((value)=>{
    	console.log(value)
    })
    

    (最后结果只输出一次,就不会出现上面的情况了)

    展开全文
  • 小程序请求超时

    2020-05-07 10:36:36
    网上搜的全是只要fail,就toast请求超时,这种完全不符合我们的要求。 只有确实是超时了,才能toast请求超时。 排名前5的文章都是这样,看不下去了,无奈只能自己研究。 app.json可以设置超时时间,默认都是60 ...

    网上搜的全是只要fail,就toast请求超时,这种完全不符合我们的要求。

    只有确实是超时了,才能toast请求超时。

    排名前5的文章都是这样,看不下去了,无奈只能自己研究。

    app.json可以设置超时时间,默认为60秒

    "networkTimeout": {
        "request": 60000,
        "downloadFile": 60000,
        "uploadFile":60000,
        "connectSocket":60000
      }

    wx.request时超时会进入fail方法

    fail: function (err) {
          if(err&&err.errMsg&&err.errMsg.indexOf('timeout')!=-1){
            wx.showToast({
            title: '请求超时',
            icon: 'none'
          })
          }   
        }

     

    展开全文
  • Feign Client 第请求超时

    千次阅读 2018-10-25 17:25:21
      有时,在项目启动之后,第次进行 Feign 请求时,会超时。这是因为,Hystrix 开启之后的默认超时时间是 1 ,如果在这一秒内还没有做出响应那么就会超时,进入 fallback 代码。由于 Bean 装配和懒加载机制等,...

      有时,在项目启动之后,第一次进行 Feign 请求时,会超时。这是因为,Hystrix 开启之后的默认超时时间是 1 秒,如果在这一秒内还没有做出响应那么就会超时,进入 fallback 代码。由于 Bean 装配和懒加载机制等,Feign 在首次请求的时候相对较慢。下面三种方法可以解决 1 秒问题:

    1. 将 Hystrix 的超时时间调高,如:
    ### Hystrix 配置
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                # 熔断器超时时间,默认:1000/毫秒
                timeoutInMilliseconds: 5000
    
    1. 禁用 Hystrix 的超时时间,如下:
    hystrix:
      command:
        default:
          execution:
            timeout:
              # 禁用熔断器超时时间,不推荐
              enabled: false
    
    1. 不使用 Hystrix,强烈不推荐,如下:
    ### Feign 配置
    feign:
      # 是否开启断路器(熔断器)
      hystrix:
        enabled: false
    
    展开全文
  • Android网络请求超时处理

    千次阅读 2018-04-17 13:48:18
    转自:... 使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(timeout, unit);方法用于处理用户的请求超时的操作,可以设置请求超时的时间(ti...

    转自:http://www.cnblogs.com/tony-yang-flutter/p/androidtimeout.html

    以用户登录为例介绍用户访问网络时的请求超时处理的两种方法:

    一. 使用android提供的工具类AsyncTask类,此类提供了一个AsyncTask.execute().get(timeout, unit);方法用于处理用户的请求超时的操作,可以设置请求超时的时间(timeout)以及请求时间的单位(unit)。

      例如:设置超时时间为2秒,单位为毫秒

    try {
                AsyncTask(此处应该是它的实例化对象).execute().get(2000, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                            e.printStackTrace();
            } catch (ExecutionException e) {
                                            e.printStackTrace();
            } catch (TimeoutException e) {
                //此处用来处理用户超时后的操作,例如:跳转界面,弹出提示框。
                //备注:此处不能直接进行界面操作,否则回报ANR异常。如果相处理界面操作,则和handler进行结合
            }        
    二. 第二种方法相对来说就比较复杂了,你需要自定义请求超时操作

    1)自定义一个TimerTask,用于向handler发送请求超时消息

    class MyTimerTask extends TimerTask{
    
            @Override
            public void run() {
                handler.sendEmptyMessage(5000);
            }
            
        }

    2)定义一个设置请求超时的方法,超时时间为5秒

    复制代码
        private void checkTimeOut(){
            try{
                timer = new Timer();
                task = new MyTimerTask();
                timer.schedule(task, 5000);
            }catch(Exception e){
                Log.e("timer", e.getMessage());
            }
        }

    3)开发登录线程

    复制代码
        private class LoginThread extends Thread{
            @Override
            public void run() {
                try{
                    try {
                        checkTimeOut();
                        //下面用于编写请求网络数据的代码
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    handler.sendEmptyMessage(5000);
                }catch(Exception e){
                    Log.e("LoginThread", e.getMessage());
                }
            }
        }

    4)在handler中处理请求超时或者请求成功的操作

    复制代码
        Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                switch(msg.what){
                case 5000:
                    //关掉timer
                    timer.cancel();
                    //处理请求超时时要做的操作
                    break;
                }
            };
        };


    每天进步一点点!


    展开全文
  • Retrofit设置请求超时

    万次阅读 2016-08-22 14:56:22
    Retrofit设置请求超时 最近笔者在用Retrofit的时候有了设置请求超时的需求,但是看了一下Retrofit的API,并没有发现有设置请求超时的方法,于是上网查了下相关资料,这里就跟大家分享一下. 因为Retrofit是依赖于OkHttp...
  • NSURLSessionTask 上传图片 请求超时

    千次阅读 2018-09-07 16:58:32
    如果上传图片的超时10, 同时并发上传很多张图片,容易导致部分请求超时,比如同时并发上传50张图片,差不多有20张是返回请求超时的 。 NSMutableURLRequest *request = [[NSMutableURLRequest alloc...
  • 请求超时问题排查

    千次阅读 2020-05-28 13:12:52
    微服务调用一个阻塞连接,需要2到3分钟,但是每次到60时,后台出现504 getway timeout问题,初步怀疑是ribbon的超时导致的,检查发现不是,排除;再次怀疑nginx默认的60秒超时导致,发现配置了proxy-read-timeout...
  • 解决axios请求超时

    千次阅读 2020-01-14 10:42:03
    在使用过程中会有许多问题存在,比如由于网络不稳定导致请求超时/失败,通常有两种解决方案,种是提示用户重新提交请求,另种是进行相关提示并自动重新发送请求。第二种方式用户体验明显高于第种方式。本文就...
  • springboot设置请求超时

    千次阅读 2020-06-18 16:15:31
    超时设置 默认的超时设置 默认是没有超时限制的,见SimpleClientHttpRequestFactory 类的 private int connectTimeout = -1; // -1 表示不超时 private int readTimeout = -1; // -1 表示不超时 1.3版本之前 @...
  • Tomcat请求超时

    千次阅读 2018-05-11 12:59:51
    本问题是:本地主机上的服务器Tomcat V7.0服务器无法在45内启动。如果服务器需要更多的时间,请尝试在服务器编辑器中增加超时时间。修改eclipse的工作空间D:\Work\codes\hands\.metadata\.plugins\org.eclipse.wst...
  • 分布式下的请求超时

    万次阅读 2020-08-25 13:32:06
    分布式下的请求超时 前言 在日常的生产中,用户往往不在乎你使用的什么样的性能优化的手段,他们更关心地是点击一个按钮后能否立马给予反馈。这个用户等待反馈的时间,就是我们软件设计过程中的用户操作的响应时间。...
  • uni-app请求超时问题

    千次阅读 2020-10-06 16:30:05
    最近在写一个uni-app的程序,经常出现请求超时的问题 最后发现在manifest.json里可以设置请求时间,如果网络不稳定超过请求时间还没有获得回应,就会出现请求超时,具体设置如图 这个单位是毫秒,如图设置的是...
  • // 显示超时错误信息 function showFailureMessage(){    alert('系统繁忙,请稍候再试!'); } var handle={ onCreate: function(request) {  // 当创建Ajax请求时,显示loading  Element.show('loading')...
  • Vue项目请求超时处理

    千次阅读 2019-10-28 14:48:25
    现在网页项目大多采用前后端分离模式,这种模式优点有很多,但是也会带来不少问题,比如:请求后端接口时会受网络因素影响,导致请求超时;这就需要我们在请求方法中设置拦截,对请求超时做处理; 下面就是我在项目...
  • 次前端提交文件请求超时问题

    千次阅读 2019-09-16 11:52:29
    问题环境: ...同时在后端服务日志中看到整个请求进入到具体服务的处理时长为3左右,远小于浏览器的10秒超时; 同时单独的上传附件(异步、el-upload控件),并没有出现以上超时问题; 问题原因:...
  • ReactNative fetch请求封装实现请求超时

    千次阅读 2018-03-30 16:50:11
    以前觉得写这些东西没啥用,现在觉得这是种很...利用Promise.race()实现请求超时 //封装的请求 带超时 const _timeout = 30*1000 //默认30 //GET请求 function GET(url, version, timeout = _timeout) { var d...
  • ping请求超时问题研究

    2020-10-28 22:52:20
    近期公司用到的一个第三方节点无法访问,想用ping命令来查看一下是否可以ping通第三方服务器,结果返回"请求超时",后来第三方公司回邮件告诉我, 他们公司是禁ping的,可以在cmd中用nslookup命令来查看相关信息。 ...
  • 我有一个项目,部署在两个不同的服务器A和B,然后调用同一个接口,其中服务器A在毫秒级内返回,服务器B大概10左右才返回。 由此我认为响应时间久与代码逻辑没有关系,可能是跟网络传输有关系,所以我在宿主机...
  • 我这次遇到的问题就是django项目单独运行没有问题,但是部署到uwsgi服务器中后出现一个ajax请求时间比较长(大于uwsgi默认的60),所以1min后抛出了POST net::ERR_EMPTY_RESPONSE,本来以为ajax超时,最后确定是...
  • //设置请求超时时间 如果在设置时间内 服务端还没有返回数据 则提示请求超时 xhr.timeout = 2000; // 2超时 会中断(取消)本次请求 //超时回调 xhr.ontimeout = function(){ alert("请求超时,请稍后重试..."); } ...
  • 解决第请求Feign超时异常的方案

    千次阅读 2019-11-03 16:16:12
    当第次调用Feign时出现超时返回null控制针的解决方案 ...hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000 #设置超时时间为5 解决方案二 hystrix.command.defau...
  • nginx比较强大,可以针对单个域名请求做出单个连接超时的配置. 比如些动态解释和静态解释可以根据业务的需求配置proxy_connect_timeout :后端服务器连接的超时时间_发起握手等候响应超时时间proxy_read_timeout:...
  • express请求超时的时间设置

    千次阅读 2019-09-03 22:19:04
    参考教程:https://www.e-learn.cn/content/wangluowenzhang/393106 connect-timeout官网:... express请求超时重点推荐方法: 【nodejs请求超时处理】重点推荐的方法 // 路由请求超时的中间件 app.use(funct...
  • 设置HTTP请求超时自动重发

    万次阅读 2016-08-26 16:04:51
    Java Http请求当请求超时时底层会默认进行重发,默认重发次数为3次,在某些情况下为了防止重复的请求,需要将自动重发覆盖。 设置HTTP参数,设置不进行自动重发: //设置HTTP请求超时时不进行自动重发 ...
  • timeout属性等于一个整数,用来设置当请求发出后等待接受响应的时间。ontimeout()方法则是当等待超时后,自动执行的回调方法。 语言: xhr.timeout = xxx; xhr.ontimeout=function(){ console.error(“The request ...
  • 关于angular的HTTP请求超时处理

    千次阅读 2019-08-17 16:09:54
    angular中的http请求如果存在网络中断或者超时的话,一般系统都会有默认值(本人测试大概为20左右),这种感觉给用户的体验太差,因此有效改变超时的时间限制是很有必要的,现在记录一下。 angular5以后的超时...
  • 一个请求10后无响应怎么做处理,我想在超时后调用缓存数据,但是不知道怎么判断网络超时,项目用了afinal,没找到超时后的处理方法,只有onsuccess和onfailed方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 172,478
精华内容 68,991
关键字:

一个请求超时几秒