如何在外部终止一个pengding状态的promise对象
2018-06-24 01:25:50来源:未知 阅读 ()
今天在整理前段时间做过的项目,发现之前在集成web环信的时候遇到过一个奇怪的需求:
需要终止一个正在进行等待返回的promise,或者阻止其调用resolve和reject。(具体为何会有这种需求我也不太记得了。。。
现在回头看,一定会有其他的常规解决方案)。
不过本着对未知牛角尖的专研精神(最近有点闲),在咨询知乎大神,重读阮大神的《es6入门》书中promise一章后,
找到了一个原生js的解决方案:Promise.race。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <button onclick="getInterface()">发送请求</button> <button id="cancel">取消调用接口</button> <script type="text/javascript"> //Promise.race([a,b])参数为一个promise对象组成的数组, //此方法用来比较啊a和b哪一个promise先返回,Promise.race结果就返回这个先返回的promise参数 function getInterface() { var promise1 = new Promise(function(resolve, reject) {
//模拟ajax异步请求 setTimeout(resolve, 3000, '接口返回成功!'); }); var promise2 = new Promise(function(resolve, reject) { document.querySelector('#cancel').addEventListener('click', function() { reject('取消等待接口!'); }); }); Promise.race([promise1, promise2]).then(function(value) { console.log(value); }).catch(function(value) { console.log(value); }); } </script> </body> </html>
上面的代码点击发送请求按钮后,调用getIterface方法,
方法内创建并立即执行两个promise函数:promise1和promise2。Promise.race方法立即开始监听这两个promise对象的状态。
1. 如果3秒内用户有任何操作,那么promise1内的resolve方法被调用:此时“接口”返回成功,Promise.race不再监听promise2的状态,
直接返回接口的返回结果:'接口返回成功!'。
2. 如果3秒内用户点击取消调用接口按钮 ,那么promise2内的reject方法被调用,此时Promise.race不再监听promise2(异步接口)的返回状态,
直接返回promise2的返回结果:'取消等待接口'。
这样就可以模拟外部中断promise返回结果了,比如 promise1是一个ajax请求,那么就可以在返回前在Promise.race中abort()请求了。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:JavaScript-日期相关
- JavaScript闭包函数访问外部变量的方法 2019-12-24
- 浏览器上实现右键菜单的方法 2019-10-25
- 如何在eclipse中安装angularjs插件 2019-08-14
- vue3+typescript引入外部文件 2019-03-10
- Cesium Vue开发环境搭建 2018-12-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash