【Promise】Promise实现请求超时处理(基本版)
2016-07-18 15:54
302 查看
首先是没有加入请求超时的情况:
再看一下加入超时的代码:
原理其实很简单,就是利用Promise.race,我们先创建一个Promise,里面用setTimeout进行处理,然后将新创建的Promise与我们之前使用的Promise"比赛"一下。
var http = require('http'); var url = require('url'); function get(addr) { return new Promise(function(resolve, reject) { var url_obj = url.parse(addr); var options = { hostname: url_obj.hostname, path: url_obj.path, method: 'GET' }; var req = http.request(options, function(res) { res.setEncoding('utf8'); var data = ''; res.on('data', function (chunk) { data += chunk; }); res.on('end', function () { data = JSON.parse(data); resolve(data); }); }); req.on('error', function(e) { reject(e) }); req.end(); }); } get('http://demos.so/result/homework.promise.userInfo').then(function (args) { return Promise.all([get('http://demos.so/result/userid=' + args['_id']), get('http://demos.so/result/student=' + args['_id'])]); }).then(function (args) { console.log(args); }).catch(function(err){ console.log(err); });
再看一下加入超时的代码:
var http = require('http'); var url = require('url'); function delayPromise(ms) { return new Promise(function (resolve) { setTimeout(resolve, ms); }); } function timeoutPromise(promise, ms) { var timeout = delayPromise(ms).then(function () { throw new Error('Operation timed out after ' + ms + ' ms'); }); return Promise.race([promise, timeout]); } function get(addr) { return new Promise(function(resolve, reject) { var url_obj = url.parse(addr); var options = { hostname: url_obj.hostname, path: url_obj.path, method: 'GET' }; var req = http.request(options, function(res) { res.setEncoding('utf8'); var data = ''; res.on('data', function (chunk) { data += chunk; }); res.on('end', function () { data = JSON.parse(data); resolve(data); }); }); req.on('error', function(e) { reject(e) }); req.end(); }); } timeoutPromise(get('http://demos.so/result/homework.promise.userInfo'),1000).catch(function (err) { console.log(err); }).then(function (args) { return Promise.all([timeoutPromise(get('http://demos.so/result/userid=' + args['_id']), 1000), timeoutPromise(get('http://demos.so/result/student=' + args['_id']), 1000)]); }).then(function (args) { console.log(args); }).catch(function (err) { console.log(err); });
原理其实很简单,就是利用Promise.race,我们先创建一个Promise,里面用setTimeout进行处理,然后将新创建的Promise与我们之前使用的Promise"比赛"一下。
相关文章推荐
- Ceph对象存储网关中的索引工作原理<转>
- oracle_动态sql与参数游标
- 快速排序算法C语言
- 杭电 ACM 2035
- POJ 1084(DLX重复覆盖)
- 获取当前控件的背景颜色
- chapter 1:计算机系统漫游
- chapter 1:计算机系统漫游
- JAVA广度优先搜索---寻找从A点到B点最短路径
- 概述 RequireJS是一个工具库,主要用于客户端的模块管理。它可以让客户端的代码分成一个个模块,实现异步或动态加载,从而提高代码的性能和可维护性。它的模块管理遵守AMD规范(Asynchronou
- 深入理解HashMap(及hash函数的真正巧妙之处)
- App架构设计经验谈:服务端接口的设计
- 合并两个排序的链表
- 移动端Web开发如何处理横竖屏
- 五分钟学会 Canvas 基础(一)
- Android轮播图的实现
- 合并区间
- [Database] 数据库索引-聚合索引与非聚合索引
- AngularJS 过滤器
- 1.【排序】Merge Sorted Array--Accepted Java code