/**
* [*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版)出错自调用的更多相关文章

  1. 在执行xp_cmdshell的过程中出错,调用'LogonUserW'失败,错误代码:'1909'

    在上篇文章Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5里面,我介绍了SQL ...

  2. Promise 多重链式调用

    Promise对象是用于异步操作的. Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调.如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢? 使用Promise,我们就 ...

  3. ES6 Promise 的链式调用

    1.什么是Promise Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息. 2.对象的状态不受外界影响.Promise 对象代表一个异步操作,有三种状态: pending: 初始 ...

  4. 使用Promise解决多层异步调用的简单学习【转】

    前言 本文章转载文章: https://www.jianshu.com/p/29da9aef4c1c 第一次接触到Promise这个东西,是2012年微软发布Windows8操作系统后抱着作死好奇的心 ...

  5. Spark3.0 preview预览版尝试GPU调用(本地模式不支持GPU)

    Spark3.0 preview预览版可以下载使用,地址:https://archive.apache.org/dist/spark/spark-3.0.0-preview/,pom.xml也可以进行 ...

  6. Promise.then链式调用

    let a = new Promise((resolve,reject)=>{ resolve(1) }).then((r)=>{console.log(r)}).then(()=> ...

  7. 学了ES6,还不会Promise的链式调用?🧐

    前言 本文主要讲解promise的链式调用的方法及其最终方案 应用场景 假如开发有个需求是先要请求到第一个数据,然后根据第一个数据再去请求第二个数据,再根据第二个数据去请求第三个数据...一直到最后得 ...

  8. office2003-2007 绿色版 出错 文件丢失(未解决)

    - 这个版本是我大学时候(2012)年一直用到现在的版本:目录结构如下: 原来一直在32位系统中使用,没有出错过; - 刚装的两台电脑系统分别为 Win7Pro 和 Win10Pro ,都是64位的: ...

  9. 关于1.0.0版Backbone.js调用validate

    网上的调用这个方法的例子都是老版本的,新版本的调用方法有所变化,首先错误绑定事件error换成了invalid,其次设置数据时应传入{validate: true} var Chapter = Bac ...

随机推荐

  1. npm 走 privoxy 代理经常出现 shasum check failed 的解决办法

    今天在下载一个比较大的项目,经常 shasum check failed ,太烦了,于是想切淘宝源,分别尝试 nrm 切换和传递 --registry ,结果都出现 Unexpected end of ...

  2. Wepy在VScode中的高亮显示

    小程序的wepy框架会生成后缀名为.wpy的文件,此文件用VScode打开时并不是高亮的,官方文档给我们提供了两种方案进行高亮 方案一:   1. 在 Code 里先安装 Vue 的语法高亮插件 Ve ...

  3. Tomcat 8默认工具manager管理页面访问配置

    Tomcat 8默认工具manager管理页面访问配置 1. 分配相关的角色权限 需要配置的配置文件是${catalina.home}/conf/tomcat-users.xml先给Tomcat访问相 ...

  4. android recovery 升级之USB设备挂载

    Recovery升级过程,通常会从两个地方获取升级包update.zip升级,一般在线升级,会把升级包下载到cache分区,本地升级会从usb或者tf卡中升级.本文讨论下,本地USB升级时,无法挂载U ...

  5. 自己写bitmap

    备注:1.原创文章,转载请标明出处: 2.欢迎建议和意见 3.我的实现是C语言,为了保护公司隐私,下述数据类型被我改了.实际上int应改是无符号4个字节的类型,byte是有符号1个字节,才能保证移植性 ...

  6. solr-query

    解释: 1.query:获取全部数据的SQL 2.deltaImportQuery:获取增量数据时使用的SQL 3.deltaQuery:获取pk的SQL 4.parentDeltaQuery:获取父 ...

  7. 10-openldap同步原理

    openldap同步原理 阅读视图 openldap同步原理 syncrepl.slurpd同步机制优缺点 OpenLDAP同步条件 OpenLDAP同步参数 1. openldap同步原理 Open ...

  8. Java ——基础语法

    package myhello; // 本类所在的包的路径 import af.util.AfMath; // 导入对应的类 import java.util.Random; // 导入随机数的类 p ...

  9. Linux下postgresql数据库部署与配置

    1.检查postgresql是否已经安装:rpm -qa | grep postgres 2.检查PostgreSQL 安装位置:rpm -qal | grep postgres 3.卸载Postgr ...

  10. 恢复已删除ibdata1

    最近我有一个客户删除InnoDB主表空间 - ibdata1 - 和重做日志 - ib_logfile *的情况. MySQL使InnoDB文件始终保持打开状态.以下恢复技术基于此事实,它允许抢救数据 ...