update: Promise的静态方法
This commit is contained in:
		
							parent
							
								
									83891011d0
								
							
						
					
					
						commit
						e88d67cef1
					
				@ -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>
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user