木灵鱼儿
阅读:1722
koa框架1 基础入门之promise
promise实际是一种格式(封装格式),所有的方法按照promise的要求写,像jq的ajax方法,es6的fetch,axios这些,都是使用了promise标准。
他的原理大概如下
let p = new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open("GET", "xxx/api", true);
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
resolve(xhr.responseText);
} else {
reject(xhr);
};
};
};
});
p.then(res => {
//请求成功
console.log(res);
}, xhr => {
//请求失败
console.log(xhr);
});
我们将异步的请求放在promise对象里面,成功就调用resolve方法,传入获取到的参数,失败的话调用reject,将xhr对象传入。
也就是说回调then第一个参数使用的方法就是resolve,第二个为reject。
而且错误的回调promise还有第二种写法,也是我们常见的写法
p.then(res => {
//请求成功
console.log(res);
})
.catch(xhr => {
//请求失败
console.log(xhr);
});
通过catch捕获错误,这样也行,但是这样意思是所有的错误,都会通过这个catch捕获触发,所有的错误回调使用同一个方法。
而上面那个,是独立的,所以说略有不同,而使用catch也是对应有多个then的时候。
p.then(res => {
//第一次
console.log(res);
})
.then(res => {
//第二次
console.log(res);
})
.then(res => {
//第三次
console.log(res);
})
.then(res => {
//第四次
console.log(res);
})
.catch(xhr => {
//请求失败
console.log(xhr);
});
如果我们有多个then的时候,错误的方法没必要总是单独写,可以通过通用的一个catch来调用,省事。
all方法
promise还支持多个异步请求,就是说假如有5个异步请求,我需要他们全部都完成才能触发某个操作,那么就可以使用all方法,相反,如果有一个请求出错,就不会触发方法。
代码如下:
Promise.all([
$.ajax({
url: "xxx/api",
dataType: "json"
}),
$.ajax({
url: "xxx/api",
dataType: "json"
}),
$.ajax({
url: "xxx/api",
dataType: "json"
}),
]).then(arr => {
console.log(arr);
}, xhr => {
console.log(xhr);
});
all接收一个数组,数组里面存放着异步方法,由于是多个,所有then接收的参数,也会是一个请求返回的内容数组,其内容的数组顺序和请求方法数组顺序相同。
错误则是共用方法。
race
这个和all不同,all是必须所有的请求都要成功,而race则是只要有一个成功了,就结束了。
代码书写和all相同,只是用法不一样。
s
相对来说也用的比较少
Promise.race([]).then(res=>{},xhr=>{})
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
Promise失败重试,可指定重试次数
//模拟异步请求 function axiosFn() { return new Promise((resolve, reject) => { const flge = Math.random(); //随机值 setTimeout(() => { //大于0.7就是成功 if (flge > 0.7) { return resolve(flge); } else { return reject(...
手写Promise
/* * @Author: mulingyuer * @Date: 2021-12-30 22:06:58 * @LastEditTime: 2022-01-03 05:22:30 * @LastEditors: mulingyuer * @Description: 手写promise * @FilePath: \undefinedc:\Users\13219\Desktop\promise.js * 怎么可能会有bug!!! */ /** * @description: 自定义promise * @param {fucntion} executor 执行器函数(同...
promise 队列
数组map实现function fn1() { return new Promise((resolve, reject) => { setTimeout(() => { console.log(1); resolve(); }, 500) }) } function fn2() { return new Promise((resolve, reject) => { setTimeout(() => { console.l...
利用Promise实现一个超时结束等待操作
promise如果没有指定状态,那么就一直会处于pending中,如果长时间不处理,那么这个东西会一直存在于内存中,显然是不合理的。如果是一个超多请求项目,那么我们就需要考虑下性能问题了。promise中有一个rece方法,它接收一个promise作为值的数组,它的特性就是:哪个promise先执行,他就处理那一个,不管是resolve还是reject;在then中,他也只有一个值,不同于Promise.all方法返回的是一个数组,rece返回的值是最快完成的那个promise的返回值。利用这个特性,我们可以制作一个超时处理。function delayPromise(promise, ...
异步队列管理器
造这个轮子其实也是没得办法,搜不到合适的轮子用,就只能自己干了。使用场景我们有N个异步任务promise,他们没有顺序关系,谁先触发都无所谓,但是我们只关心一点,如果某一个任务出错,后续就不要运行了,只有全部都success完成,那么才运行成功后的处理方式then。当然,我们肯定不能使用Promise.all运行N个任务,这等于是同步触发了,如果我有2000个任务,难道你也一口气发2000个任务,那这就不现实了,所以这里我们要引入线程概念,一个进程可以有多个线程,那么进程就是管理器,线程就是我们一次可以发多少个请求。线程是可以配置的,我们可以指定触发多少个线程,当1个线程完成后,我们要填...
Promise
基本了解Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。Promise对象有以下两个特点。(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfil...