大家好,又见面了,我是你们的朋友全栈君。
返回目录
promise是什么?
promise是异步编程的一种解决方案:
从语法上讲,promise是一个对象,从它可以获取异步操作的消息;
从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。
promise有三种状态:
pending(等待态),fulfiled(成功态),rejected(失败态);
Promise有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态
状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected
创造promise实例后,它会立即执行。
能解决什么问题?
一般来说我们会碰到的回调嵌套都不会很多,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称回调地狱。
promise是用来解决两个问题的:
1、回调地狱,代码难以维护,常常第一个的函数的输出是第二个函数的输入这种现象
2、promise可以支持多个并发的请求,获取并发请求中的数据
注:这个promise可以解决异步的问题,本身不能说promise是异步的
//一般回调模式
function sleep(time, callback) {
setTimeout(function () {
callback();
}, time);
}
sleep(5000, function () {
console.log('我会在5秒后打印');
});
//promise模式
function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
sleep(5000).then(() => console.log('我会在5秒后打印'));
promise用法
promise是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。
1、创建
let p = new Promise((resolve, reject) => {});
Promise的构造函数接收一个参数:
函数,并且这个函数需要传入两个参数:
resolve:异步操作执行成功后的回调函数
reject:异步操作执行失败后的回调函数
2、then链式操作的用法
p.then((data) => {
console.log(data);
})
.then((data) => {
console.log(data);
})
.then((data) => {
console.log(data);
});
3、reject的用法
把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。
let p = new Promise((resolve, reject) => {
let num = Math.ceil(Math.random() * 10);//生成1-10的随机数
if (num <= 5) {
resolve(num);
} else {
reject('数字不符合要求');
}
});
p.then((data) => {
console.log(num);
}, (err) => {
console.log('rejected', err);
};
then中传了两个参数,then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调,所以我们能够分别拿到他们传过来的数据。
4、catch的用法
Promise对象除了then方法,还有一个catch方法,它和then的第二个参数一样,用来指定reject的回调。
p.then((data) => {
console.log(data);
}).catch((err) => {
console.log('rejected', err);
});
效果和写在then的第二个参数里面一样。不过它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死,而是会进到这个catch方法中。
5、all的用法
谁跑的慢,以谁为准执行回调。all接收一个数组参数,里面的值最终都算返回Promise对象
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
let Promise1 = new Promise((resolve, reject) => {});
let Promise2 = new Promise((resolve, reject) => {});
let Promise3 = new Promise((resolve, reject) => {});
let p = Promise.all([Promise1, Promise2, Promise3]);
p.then(() => {
//三个都成功,则成功
}, () => {
//只要有失败,则失败
});
6、race的用法
谁跑的快,以谁为准执行回调
race按字面解释,就是赛跑的意思。race的用法与all一样,只不过all是等所有异步操作都执行完毕后才执行then回调。而race的话只要有一个异步操作执行完毕,就立刻执行then回调。
注意:其它没有执行完毕的异步操作仍然会继续执行,而不是停止。
Promise.race([Promise1, Promise2]).then((data) => {
console.log(data);
}).catch((err) => {
console.log(err);
});
参考:链接
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133644.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...