update: Promise的静态方法

This commit is contained in:
qianguyihao 2021-05-23 23:02:52 +08:00
parent 83891011d0
commit e88d67cef1

View File

@ -1,11 +1,10 @@
## Promise 的常用 API 分类
## Promise 的常用API分类
### Promise 的实例方法
### Promise的实例方法
**实例方法**我们需要先 new 一个 promise 实例对象然后通过 promise 对象去调用 `then``catch``finally`方法这几个方法就是 Promise 的实例方法
**实例方法**我们需要先 new 一个 promise实例对象然后通过 promise对象去调用 `then``catch``finally`方法这几个方法就是 Promise 的实例方法
具体来说Promise 的自带API 提供了如下实例方法
Promise 的自带 API 提供了如下实例方法
- promise.then()获取异步任务的正常结果
@ -13,124 +12,163 @@
- promise.finaly()异步任务无论成功与否都会执行
### Promise的静态方法
### Promise 的静态方法
**静态方法**可以直接通过大写的`Promise.xxx`调用的方法这里的`xxx`就称之为静态方法
具体来说Promise 的自带API 提供了如下静态方法
Promise 的自带 API 提供了如下静态方法
- `Promise.resolve()`
- `Promise.resolve()`
- `Promise.reject()`
- `Promise.reject()`
- `Promsie.all()`
- `Promsie.all()`并发处理多个异步任务所有任务都执行成功才算成功走到 resolve只要有一个失败就会走到 reject整体都算失败
- `Promise.race`
- `Promise.race`并发处理多个异步任务只要有一个任务执行成功就会成功马上会走到 resolve
前面的几篇文章讲的都是 Promise**实例方法**今天这篇文章我们来详细讲一下 Promise**静态方法**
前面的几篇文章讲的都是 Promise **实例方法**今天这篇文章我们来详细讲一下 Promise **静态方法**
## Promise 的常用 API对象方法重要
## Promise.resolve() Promise.reject()
Promise 自带的 API 提供了如下对象方法
当我们在定义一个 promise 的过程中如果涉及到异步操作那就需要通过`new Promise`的方式创建一个 Promise 实例
- Promise.all()并发处理多个异步任务所有任务都执行成功才能得到结果
但有些场景下我们并没有异步操作**仍然想调用 promise.then**此时我们可以用 `Promise.resolve()` 将其包装成成功的状态同理`Promise.reject()`可以包装成失败的状态
- Promise.race(): 并发处理多个异步任务只要有一个任务执行成功就能得到结果
比如说有的时候promise 里面并不涉及异步操作我只是**单纯地想通过 promise 对象返回一个字符串**有的业务就是有这样的需求那就可以通过 `Promise.reslove('字符串')` `Promise.reject('字符串')` 这种**简写**的方式返回
下面来详细介绍
这两种情况我们来对比看看
### Promise.all() 代码举例
1
```js
function foo(flag) {
if (flag) {
return new Promise((resolve) => {
// 这里可以做异步操作
resolve('success');
});
// return Promise.resolve('success2');
} else {
return new Promise((reslove, reject) => {
// 这里可以做异步操作
reject('fail');
});
}
}
// 执行 reslove 的逻辑
foo(true).then((res) => {
console.log(res);
});
// 执行 reject 的逻辑
foo(false).catch((err) => {
console.log(err);
});
```
2见证奇迹的时刻
```js
function foo(flag) {
if (flag) {
// Promise的静态方法直接返回字符串
return Promise.resolve('success');
} else {
// Promise的静态方法直接返回字符串
return Promise.reject('fail');
}
}
// 执行 reslove 的逻辑
foo(true).then((res) => {
console.log(res);
});
// 执行 reject 的逻辑
foo(false).catch((err) => {
console.log(err);
});
```
1 和例 2 的打印结果是一样的这两段代码的区别在于 1 里面可以封装异步任务 2 只能单纯的返回一个字符串等变量不能封装异步任务
## Promise.all()
`Promsie.all([p1, p2, p3])`并发处理多个异步任务所有任务都执行成功才算成功走到 resolve只要有一个失败就会走到 reject整体都算失败参数里传的是 多个 promise 实例组成的数组
### 代码举例
```js
/*
封装 Promise 接口调用
*/
function queryData(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState != 4) return;
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理正常结果
resolve(xhr.responseText);
} else {
// 处理异常结果
reject('服务器错误');
}
};
xhr.open('get', url);
xhr.send(null);
});
}
const promise1 = queryData('http://localhost:3000/api1');
const promise2 = queryData('http://localhost:3000/api2');
const promise3 = queryData('http://localhost:3000/api3');
Promise.all([promise1, promise2, promise3]).then((res) => {
// 这里拿到的 res是三个返回结果组成的数组。
console.log(res);
});
```
### Promise.all()图片上传举例
比如说现在有一个**图片上传**的接口每次请求接口时只能上传一张图片需求是当用户连续上传完三张图片之后给用户一个上传成功的提示这个时候我们就可以使用`Promsie.all()`
## Promise.race()
`race`的中文翻译可以理解为竞赛
代码举例
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script type="text/javascript">
/*
```js
/*
封装 Promise 接口调用
*/
function queryData(url) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState != 4) return;
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理正常结果
resolve(xhr.responseText);
} else {
// 处理异常结果
reject('服务器错误');
}
};
xhr.open('get', url);
xhr.send(null);
});
function queryData(url) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState != 4) return;
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理正常结果
resolve(xhr.responseText);
} else {
// 处理异常结果
reject('服务器错误');
}
};
xhr.open('get', url);
xhr.send(null);
});
}
var promise1 = queryData('http://localhost:3000/api1');
var promise2 = queryData('http://localhost:3000/api2');
var promise3 = queryData('http://localhost:3000/api3');
var promise1 = queryData('http://localhost:3000/api1');
var promise2 = queryData('http://localhost:3000/api2');
var promise3 = queryData('http://localhost:3000/api3');
Promise.all([promise1, promise2, promise3]).then((result) => {
console.log(result);
});
</script>
</body>
</html>
Promise.race([promise1, promise2, promise3]).then((result) => {
console.log(result);
});
```
### Promise.race() 代码举例
代码举例
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script type="text/javascript">
/*
封装 Promise 接口调用
*/
function queryData(url) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState != 4) return;
if (xhr.readyState == 4 && xhr.status == 200) {
// 处理正常结果
resolve(xhr.responseText);
} else {
// 处理异常结果
reject('服务器错误');
}
};
xhr.open('get', url);
xhr.send(null);
});
}
var promise1 = queryData('http://localhost:3000/api1');
var promise2 = queryData('http://localhost:3000/api2');
var promise3 = queryData('http://localhost:3000/api3');
Promise.race([promise1, promise2, promise3]).then((result) => {
console.log(result);
});
</script>
</body>
</html>
```