Promise学习路线:
1:应用:
1) promise 是什么?
2) 解决了什么问题?
3) promise中的两大痛点
4) 特点是什么?
5) 有哪些内容? 3个特殊属性
6) 原型api有哪些?
7) 静态api有哪些?
8) 在什么时候使用?
2:promise A+
1) 制定promise的规范。
3:总结
一,什么是promise?
1,promise
是es6中新增加对象,就是为了解决回调地狱的定义出来的一种方法。我们都知道代码有同步和异步俩种。同步简单来说就是同一时间只能干一件事,而异步表示同一时间可以干多件事。promise是利用then函数的链式调用解决了异步回调地狱问题。
2,具体地说:
(1)从语法来说:Promise就是一个构造函数 。
(2)从功能来说:Promise对象用来封装一个异步操作并得到其操作结果。
3,注意:
bug: 只要是回调函数是就是异步的----> 错误
例如:同步回调函数
function foo(cb){
console.log(1);
cb(); // 推翻:所有的回调函数都是异步。
console.log(3);
}
foo(()=>{
// 回调函数:当一个定义的函数,作为另一个函数的实参时。
console.log(2);
})
console.log(4);
输出结果:1234
good: 以前异步程序都是用回调函数编写---->正确
例如:
//证明:在promise之前,所有的异步都是回调函数.
console.log(1);
// 区分:哪个是同步的哪个是异步?
// 1 setTimeout() 是同步执行的
// 2 回调函数是异步执行的
setTimeout(() => {
console.log(2);
}, 0);
console.log(3);
输出结果:132
二,解决了什么问题?
1,promise为了解决异步编程的新解决方案,解决了回调地狱的问题。
三,promise中的两大痛点
1,回调地狱
痛点:可维护,可读性问题. 不是性能,不是内存问题
function foo(cb) {
console.log(1);
setTimeout(() => {
cb((cd) => {
console.log(3);
cd()
})
}, 16.7);
console.log(5);
}
foo((cb) => {
console.log(2);
setTimeout(() => {
cb(() => {
console.log(4);
})
}, 16.7);
console.log(6);
})
function ajax(options){
let {url='/',method='get',success} = options;
let xhr = new XMLHttpRequest();
// ...
xhr.onreadystatechange = ()=>{
if(xhr.readyState == 4 && xhr.status === 200){
success(xhr.responseText);
}
}
}
2,连环请求
痛点:太难看懂了.
ajax({
url:"/",
success:()=>{
ajax({
success:()=>{
ajax({
success(){
}
})
}
})
}
})
四,promise特点是什么?
1、对象的状态不受外界影响。
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。
2、一旦状态改变,就不会再变,任何时候都可以得到这个结果。
Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
代码演示
console.log(1);
setTimeout(() => {
console.log('---2--------');
}, 0);
let p = new Promise((resolve, reject) => {
// 1:该函数是不是回调函数? 是
// 2:该函数是同步执行还是异步执行? 同步执行
// 3:话说promise实例对象是为了解决异步回调地狱问题?究竟哪里的程序是异步程序呢?then 的回调函数异步执行
console.log(2);
// 1 resolve 是触发 then实参一函数的条件之一
// 2 resolve 同步触发函数,但是 then的回调函数是异步触发的
// 因为then的回调函数,在Promise内部有多个执行条件,resolve执行只是条件之一
// bug: resolve赋值不是then的实参一,是Promise内部定义的函数
resolve()
// reject 是触发then 实参二函数的条件之一&#x