5.6 KiB
Promise 的常用 API 分类
Promise 的实例方法
实例方法:我们需要先 new 一个 promise 实例对象,然后通过 promise 对象去调用 then
、catch
、finally
方法。这几个方法就是 Promise 的实例方法。
Promise 的自带 API 提供了如下实例方法:
-
promise.then():获取异步任务的正常结果。
-
promise.catch():获取异步任务的异常结果。
-
promise.finaly():异步任务无论成功与否,都会执行。
Promise 的静态方法
静态方法:可以直接通过大写的Promise.xxx
调用的方法。这里的xxx
就称之为静态方法。
Promise 的自带 API 提供了如下静态方法:
-
Promise.resolve()
-
Promise.reject()
-
Promsie.all()
:并发处理多个异步任务,所有任务都执行成功,才算成功(走到 resolve);只要有一个失败,就会走到 reject,整体都算失败。 -
Promise.race
:并发处理多个异步任务,只要有一个任务执行成功,就会成功(马上会走到 resolve);
前面的几篇文章,讲的都是 Promise 的实例方法;今天这篇文章,我们来详细讲一下 Promise 的静态方法。
Promise.resolve() 和 Promise.reject()
当我们在定义一个 promise 的过程中,如果涉及到异步操作,那就需要通过new Promise
的方式创建一个 Promise 实例。
但有些场景下,我们并没有异步操作,但仍然想调用 promise.then,此时,我们可以用 Promise.resolve()
将其包装成成功的状态。同理,Promise.reject()
可以包装成失败的状态。
比如说,有的时候,promise 里面并不涉及异步操作,我只是单纯地想通过 promise 对象返回一个字符串(有的业务就是有这样的需求),那就可以通过 Promise.reslove('字符串')
Promise.reject('字符串')
、这种简写的方式返回。
这两种情况,我们来对比看看。
例 1:
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:(见证奇迹的时刻)
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 实例组成的数组。
代码举例
/*
封装 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
的中文翻译,可以理解为“竞赛”。
代码举例:
/*
封装 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);
});