异步方法(promise版)出错自调用
/**
* [*promisePlus promise封装的异步,既然是异步,必然会成功或者失败,理论上失败了就失败了,但是
* 失败后能否让他过多长时间自动再调用自己呢,如果调用指定的次数还是失败,那就返回一个数组,数组
* 里面存的是每次接口失败的信息,如果能够一次成功那就更好。]
* @param {[type]} promise [promise版的函数或者promise实例]
* @param {[type]} count [调用promise版的函数的次数]
* 注意: 此函数需要配合co模块使用
*/
var promisePlus = function(promise, count) {
var cxt = this,
args = Array.prototype.slice.call(arguments, 2); return function* () {
var c = 0, message = [], power = 0;
if (!isPromise(promise) && typeof promise !== 'function') return;
if (typeof promise === 'function') promise = promise.apply(cxt, args);
while (true) {
++ power;
let t = Math.pow(2, power);
if (c ++ >= count) return Promise.reject(new Error(message));
try {
return yield promise;
} catch(err) {
message.push(err);
console.log('错误次数: ', c, ' 下一次等待时间(单位秒): ', t);
yield sleep(t * 1000);
};
};
}; function sleep(time) {
return new Promise((resolve)=>{
setTimeout(resolve, time || 1000);
});
}; function isPromise(obj) {
return 'function' == typeof obj.then;
};
};
使用姿势:
// 超时版的fetch
function _fetch(fetch, timeout) {
return Promise.race([
fetch,
new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('request timeout')), timeout);
})
]);
}; function getJSON(url) {
return new Promise((resolve, reject) => {
_fetch(fetch(url), 1000*60).then((info)=> {
return info.text();
}).then((info)=> {
// console.log('结果');
resolve(info);
}).catch((err)=> {
// console.log('出错错错啦');
reject(new Error(err));
});
});
}; var url = 'http://121.10.140.1233:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
function getToken() {
// var url = 'http://121.10.140.123:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
// var url = 'http://121.10.140.1233:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
return getJSON(url);
}; function sureAdsList() {
// var url = 'http://121.10.140.123:8080/getXiaoHuLuIndex?startDate=2017-07-11&endDate=2017-07-19&urlID=1786565&platID=2';
var url = 'http://121.10.140.123:8080/getXiaoHuLuIndex?startDate=2017-07-11&endDate=2017-07-19&urlID=1786565&platID=2';
return getJSON(url);
}; setTimeout(()=>{
// url = 'http://121.10.140.123:8080/getRoomDetail?platID=2&roomID=1786565&startDate=2017-06-18&endDate=2017-07-19';
}, 3000); // 以上都是准备环境,使用就是这样的(需要引入co模块)
co(promisePlus(getToken, 5)).then((ret)=>{
console.log(ret);
}).catch((err)=>{
console.log(err);
});
异步方法(promise版)出错自调用的更多相关文章
- 在执行xp_cmdshell的过程中出错,调用'LogonUserW'失败,错误代码:'1909'
在上篇文章Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5里面,我介绍了SQL ...
- Promise 多重链式调用
Promise对象是用于异步操作的. Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调.如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢? 使用Promise,我们就 ...
- ES6 Promise 的链式调用
1.什么是Promise Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息. 2.对象的状态不受外界影响.Promise 对象代表一个异步操作,有三种状态: pending: 初始 ...
- 使用Promise解决多层异步调用的简单学习【转】
前言 本文章转载文章: https://www.jianshu.com/p/29da9aef4c1c 第一次接触到Promise这个东西,是2012年微软发布Windows8操作系统后抱着作死好奇的心 ...
- Spark3.0 preview预览版尝试GPU调用(本地模式不支持GPU)
Spark3.0 preview预览版可以下载使用,地址:https://archive.apache.org/dist/spark/spark-3.0.0-preview/,pom.xml也可以进行 ...
- Promise.then链式调用
let a = new Promise((resolve,reject)=>{ resolve(1) }).then((r)=>{console.log(r)}).then(()=> ...
- 学了ES6,还不会Promise的链式调用?🧐
前言 本文主要讲解promise的链式调用的方法及其最终方案 应用场景 假如开发有个需求是先要请求到第一个数据,然后根据第一个数据再去请求第二个数据,再根据第二个数据去请求第三个数据...一直到最后得 ...
- office2003-2007 绿色版 出错 文件丢失(未解决)
- 这个版本是我大学时候(2012)年一直用到现在的版本:目录结构如下: 原来一直在32位系统中使用,没有出错过; - 刚装的两台电脑系统分别为 Win7Pro 和 Win10Pro ,都是64位的: ...
- 关于1.0.0版Backbone.js调用validate
网上的调用这个方法的例子都是老版本的,新版本的调用方法有所变化,首先错误绑定事件error换成了invalid,其次设置数据时应传入{validate: true} var Chapter = Bac ...
随机推荐
- 两个inline-block消除间距和对齐(vertical-align)
一.神奇的两个inline-block 很初级的问题,无聊决定写一个故事. 故事的主人公很简单,两个inline-block元素.代码如下,为了看起来简单明了,写得很简陋.效果图如右.发现有两个问题. ...
- Python 映射
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- redis 集群搭建
1.redis 集群 redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用.可扩展等问题,redis集群提供了以下两个好处 1.将数据自动切分( ...
- Chrome中无法断点调试的解决方案
chrome的调试功能实在是太强大了,相比之下ie的就是一垃圾. 最近在调试时出现一种情况,死活不能设置断点,也不能跟踪调试,这下抓狂了. JS也是非常简单的,也没有压缩.为什么就不能调试呢? 网上狂 ...
- 第三次web作业
em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸,最初是指字母M的宽度,故名em.现指的是字符宽度的倍数,用法类似百分比,如:0 ...
- 英文技术Podcast推荐 - 英语技术一起学
Podcast(播客)是现在比较流行的音.视频RSS订阅媒体.跟大家分享一下我所关注的一些不错的英文技术podcast,大家感兴趣可以订阅,在关注国外最前沿的技术资讯的同时更加锻炼英文听力(有很多需要 ...
- IDEA项目搭建八——使用MybatisPlus简化数据库交互
一.MybatisPlus简化数据库交互 我们使用Mybatis发现需要在mapper.xml中写很多重复的简单CRUD(增删改查),使用MybatisPlus可以大大简化这部分代码,官方文档http ...
- ArcGIS地图文档优化 mxdPerfstat工具使用体验
经常有客户会咨询到如何提高地图的显示性能.为何ArcMap刷新地图那么缓慢.为何地图服务响应要等待10多秒? 诸如这些问题,虽然它们的表象都是相似的,但是往往在分析排查问题的时候,我们发现背后的原因是 ...
- 排错-Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法
Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法 by:授客 QQ:1033553122 1.启动windows相关服务 win->services. ...
- 监听软件异常崩溃并且保持日志--CrashHandler编写自己的异常捕获类
平时写代码,我们可能会抛出各种异常,这些异常有些是我们测试过程中发现进行解决的,但是也有一些异常是我们未知的,不论是代码的逻辑问题还是Android本身底层的一些bug,我们都需要及时了解并进行解决. ...