1、promise是什么?
promise
是用于解决回调地狱的一种解决方式,也是一种解决异步程序的方式
常见的异步程序:
setTimeout
setInterval
事件处理函数
网络请求: ajax
promise
async await
// 回调地狱
function foo(callback) { //函数1
console.log('1');
callback(function(callback) { //函数2
console.log('22');
callback('你好');
})
}
foo(function(call) { //函数3
console.log('333');
call(function(a) { //函数4
console.log('4444');
console.log(a);
})
});
就像这种形式
函数1
调用函数3
,函数3
又调用函数2
,而函数2
又调用函数4
,这样上面调用下面,下面又调用上面的形式即为回调地狱
.
2、promise
主要解决了什么问题呢?
1.解决了回调函数函数层层嵌套,回调地狱的问题
2.解决代码可读性差的问题
3、怎么 创建 promise
实例
使用
Person()
创建 promise 实例
var falg = true;
let p = new Promise((resolve, reject) => {
if (falg) {
resolve();
} else {
reject();
}
});
其中 resolve
和 reject
都是 promise
的状态,其中 resolve
代表着程序执行成功,reject
代表着程序已经失败
p.then(res => {
console.log(res);
//在整个 promise 任务链上,任何一个阶段出现错误的都会执行 catch
}).catch(res => {
console.log('error');
});
p.then
即为将 promise
的状态返回,其中的catch
意为捕捉程序的错误执行,一旦程序失败,将执行reject
.
需要注意的是:在 p.then
任务链上,只要出现错误,后面的 then
就不会继续执行,而是直接执行 catch
promise
的状态码一共有三种,pending
、resolve
、reject
.
关于then的问题
1、then 执行时候返回新的promise
-----> 可以去触发下一个 then , 可以形成 then 的链式调用
2、then 中的回调函数怎么执行?
-----> resolve() 触发的,一个 resolve 可以触发 一串 then
3、then 中回调函数的参数接收的值是什么?
-----> 1. resolve() 的实参
-----> 2. 上一个 then 的 return 值
4、then 中的return 返回值的问题
-----> return 将作为下一个 then 中回调函数的 实参
1、其中
pending
为 准备状态,也就是一开始的状态,resolve
为成功状态,reject
为失败状态
2、需要注意的是,状态一旦发生改变,就不会再次更改,就是说,状态只能发生一次改变,或从pending
--->resolve
或从pending
--->reject
,不会在转向成功时中途变为失败
4、使用 promise
简单改写一个异步程序
// 原函数
// function dynamicFunc(cb) {
// setTimeout(function() {
// console.log('1s 后显示');
// cb();
// }, 1000);
// };
// var callback = function() {
// console.log('在异步结束后 log');
// };
// // ⽤传⼊回调函数的⽅式执⾏
// dynamicFunc(callback);
// 改为 promise 风格
function dynamiFunc() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('1s 后显示');
resolve();
}, 1000);
})
};
var onFullSuccess = function() {
console.log('在异步结束后 log');
}
dynamiFunc().then(onFullSuccess);
5、promise.all()
Promise.all
可以将多个Promise
实例包装成一个新的Promise
实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject
失败状态的值。
let task = [promise1(), promise2(), promise3()];
/*
Promise.all() 触发所有的 promise
参数 数组,数组中的元素为 promise 实例
作用:等所有的 promise 都成功了 执行 then
*/
Promise.all(task).then(res => {
// res 为数组,数组元素,对应的 promise 中 resolve 的 实参
console.log(res);
console.log('多个异步任务都成功了');
}).catch(res => {
console.log('多个任务中,至少有一个拒绝了');
});
6、promise.race()
多个异步任务,第一个异步任务成功了,执行 其他的任务
let tast = [promise1(), promise2(), promise3()];
/*
Promise.race()
参数:数组,数组中的元素为
*/
Promise.race(tast).then(res => {
console.log('---------------------------');
console.log('有一个异步任务成功了');
console.log('------------分界线------------');
});