0
点赞
收藏
分享

微信扫一扫

Promise的概念及基本使用①


文章目录

  • ​​封装Ajax的请求​​
  • ​​Promise 的状态改变​​
  • ​​Promise对象结果属性​​
  • ​​Promise的工作流程​​
  • ​​Promise的API​​
  • ​​Promise.resolve 方法​​
  • ​​Promise.reject 方法​​
  • ​​Promise.all 方法​​
  • ​​Promise.race 方法​​

封装Ajax的请求

<body>
<script>
/**
* 封装一个函数 sendAJAX 发送 GET AJAX 请求
* 参数 URL
* 返回结果 Promise 对象
*/
function sendAJAX(url){
return new Promise((resolve,) => {
const xhr = new XMLHttpRequest();
xhr.responseType = 'json';
xhr.open("GET", url);
xhr.send();
//处理结果
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
//判断成功
if(xhr.status >= 200 && xhr.status < 300){
//成功的结果
resolve(xhr.response);
}else{
reject(xhr.status);
}
}
}
});
}

sendAJAX('https://api.apiopen.top/getJok')
.then(value => {
console.log(value);
}, reason => {
console.warn(reason);
});
</script>
</body>

Promise 的状态改变

Promise的状态是Promise对象的属性,叫做PromiseState。
他一共有三个值:

  • pending 未决定的
  • resolved / fullfilled 成功
  • rejected 失败

而Promise的状态改变情况只有两种

  1. pending 变为 resolved
  2. pending 变为 rejected

且一个 promise 对象只能改变一次
无论变为成功还是失败, 都会有一个结果数据
成功的结果数据一般称为 value, 失败的结果数据一般称为 reason

Promise对象结果属性

Promise实例对象中还有一个属性​​PromiseResult​​,这个属性中保存着异步任务成功或失败的结果

这个结果只有两个东西可以进行修改:

  • resolve()
  • reject()

在这两个函数作出修改之后,在后续的then回调方法中,就又可以把结果给取出来。

Promise的工作流程

Promise的概念及基本使用①_封装

Promise的API

Promise 构造函数: Promise (excutor) {}
(1) executor 函数: 执行器 (resolve, reject) => {}
(2) resolve 函数: 内部定义成功时我们调用的函数 value => {}
(3) reject 函数: 内部定义失败时我们调用的函数 reason => {}

说明: executor 会在 Promise 内部立即同步调用,异步操作在执行器中执行

Promise.prototype.then 方法: (onResolved, onRejected) => {}
(1) onResolved 函数: 成功的回调函数 (value) => {}
(2) onRejected 函数: 失败的回调函数 (reason) => {}

说明: 指定用于得到成功 value 的成功回调和用于得到失败 reason 的失败回调返回一个新的 promise 对象

Promise.prototype.catch 方法: (onRejected) => {}
(1) onRejected 函数: 失败的回调函数 (reason) => {}

说明: then()的语法糖,只能指定失败的回调, 相当于: then(undefined, onRejected)

例如:

<script>
//
let p = new Promise((resolve,) => {
// ** 同步调用
// console.log(111);
//修改 promise 对象的状态
reject('error');
});

// console.log(222);

//执行 catch 方法
p.catch(reason => {
console.log(reason);
});
</script>

Promise.resolve 方法

Promise.resolve 方法: (value) => {}
(1) value: 成功的数据promise 对象
说明: ①返回一个成功/失败的 promise 对象
②resolve方法是属于Promise的方法,而不是Promise对象的方法。

例如:

<script>
//
let p1 = Promise.resolve(521);
//如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象,并且其结果为传入的参数
//如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果
let p2 = Promise.resolve(new Promise((resolve,) => {
// resolve('OK');
reject('Error');
}));
// console.log(p2);
p2.catch(reason => {
console.log(reason);
})
</script>

如果返回的是错误的Promise对象,那么浏览器会有一个报错,此时可以用catch进行处理。

Promise.reject 方法

Promise.reject 方法: (reason) => {}
(1) reason: 失败的原因
说明: 返回一个失败的 promise 对象,失败的结果为传入的值。

例如:

<script>
// let p = Promise.reject(521);
// let p2 = Promise.reject('iloveyou');
let p3 = Promise.reject(new Promise((resolve,) => {
resolve('OK');
}));
//即使传入了一个成功的对象他也只会返回一个错误的对象
console.log(p3);
</script>

Promise.all 方法

Promise.all 方法: (promises) => {}
(1) promises: 包含 n 个 promise 的数组
说明: 返回一个新的 promise, 只有所有的 promise 都成功才成功, 只要有一个失败了就直接失败。如果成功,则其结果为所有成功Promise对象结果组成的数组,如果失败,则其结果为失败的Promise的结果(不是多个失败的结果,因为第一个失败的时候就直接return了,所以只会返回第一个)。

<script>
let p1 = new Promise((resolve,) => {
resolve('OK');
})
// let p2 = Promise.resolve('Success');
let p2 = Promise.reject('Error');
let p3 = Promise.resolve('Oh Yeah');

//
const result = Promise.all([p1, p2, p3]);

console.log(result);
</script>

Promise.race 方法

Promise.race 方法: (promises) => {}
(1) promises: 包含 n 个 promise 的数组
说明: 返回一个新的 promise, 第一个完成的 promise 的结果状态就是最终的结果状态

<script>
let p1 = new Promise((resolve,) => {
setTimeout(() => {
resolve('OK');
}, 1000);
})
let p2 = Promise.resolve('Success');
let p3 = Promise.resolve('Oh Yeah');

//调用
const result = Promise.race([p1, p2, p3]);

console.log(result);
</script>


举报

相关推荐

0 条评论