目录
2.实例对象:new构造函数或类产生的对象,我们称之为实例对象。
1.Promise是JS中进行异步编程的新方案(旧的是谁?旧的是纯回调)
2.new Promise的时候,要传入一个回调函数,它是同步的回调,会立即在主线程上执行,被称为executor函数
5.executor函数会接收到2个参数,分别用形参:resolve和reject两个函数接收,分别代表成功和失败,调用方式如下:
11. Promise.resolve不一定成功和Promise.reject一定失败
一:准备:函数对象与实例对象
1.函数对象:将函数作为对象使用时,简称为函数对象。
有个注意事项:name不能修改是函数对象不可修改的属性
2.实例对象:new构造函数或类产生的对象,我们称之为实例对象。
二:准备:回调函数的分类
1.什么是回调? 没用调用,但是最终执行了
2.同步的回调函数:
3.异步的回调函数:
三:准备:js中的控制台报错
错误大全:此链接
四:Promise认识
1.Promise是JS中进行异步编程的新方案(旧的是谁?旧的是纯回调)
从语法上来说: Promise本身是一个内置的构造函数,不是回调,是程序员自己new调用的
从功能上来说: promise的实例对象可以用来封装一个异步操作(就是把异步函数比如settime等放在promise的executor回调函数中),并可以获取其成功/失败的值
2.new Promise的时候,要传入一个回调函数,它是同步的回调,会立即在主线程上执行,被称为executor函数
3.每一个Promise实例都有3种状态:初始化(pending)、成功(fulfilled)、失败(rejected)
4.每一个Promise实例在刚被new出来的那一刻,状态都是初始化(pending)
5.executor函数会接收到2个参数,分别用形参:resolve和reject两个函数接收,分别代表成功和失败,调用方式如下:
6.promise.prototype.then
如果是成功会输出成功函数里面的值'ok';如果失败输出失败函数里面的值,但是失败会有报错,因为没有回调函数,解决办法实例化对象.then() ——————then里面放两个回调分别代表成功(参数为value)和失败(参数为reason)
基本编码流程
1.创建Promise的实例对象(pending状态), 传入executor函数
2.在executor中启动异步任务(定时器、ajax请求)
3.根据异步任务的结果,做不同处理:
3.1 如果异步任务成功了:
我们调用resolve(value), 让Promise实例对象状态变为成功(fulfilled),同时指定成功的value
3.2 如果异步任务失败了:
我们调用reject(reason), 让Promise实例对象状态变为失败(rejected),同时指定失败的reason
4.通过then方法为Promise的实例指定成功、失败的回调函数,来获取成功的value、失败的reason
7.注意:then方法所指定的:成功的回调、失败的回调,都是异步的回调。 异步优先级:process.nextTick>promise.then>setTimeout>setImmediate(后两个看setTime具体延时多久)
8.promise实例封装ajax异步任务
<script>
let p = new Promise((resolve, reject) => {
// ajax异步
let xhr = new XMLHttpRequest()
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
resolve(xhr.response)
} else {
reject('请求出错')
}
}
}
xhr.open('GET', 'https://api.apiopen.top/getJoke')
xhr.responseType = 'json'
xhr.send()
})
p.then(
(value) => { console.log('成功了:', value) },
(reason) => { console.log('失败了:', reason) }
)
</script>
9. .then方法会返回一个新的Promise实例
10.promise.prototype.catch
①成功可以没有失败的回调
②失败必须前面有成功的回调,除非用catch,或者让成功语句变成undefined
11. Promise.resolve不一定成功和Promise.reject一定失败
<script>
/* 一:Promise.resolve(value值) 用于快速返回一个状态为fulfilled或reject和Promise实例对象
不一定是成功
因为传入的value值,可能是reject的,见下面第三种混合*/
// 1.麻烦老式方法:
let p = new Promise((resolve, reject) => {
resolve(100)
})
p.then(
(value) => { console.log('成功了:', value) }, //成功了: 100 立即输出
(reason) => { console.log('成功了:', reason) }
)
// 2.借助promise自身的resolve
let p2 = Promise.resolve(200)
p2.then(
(value) => { console.log('成功了2:', value) } //成功了2: 100 立即输出
)
/* 二:Promise.reject(值) 用于快速返回一个状态一定为fulfilled和Promise实例对象
一定是失败 */
let p3 = Promise.reject(-100)
p3.then(
(ralue) => { console.log('成功:', value) },
(reason) => { console.log('失败:', reason) } //失败: -100 立即输出
)
// 三:混合。。。
let pp = Promise.reject(-800)
let p4 = Promise.resolve(pp)
p4.then(
(value) => { console.log('p4成功了:', value) },
(reason) => { console.log('p4失败了', reason) } // p4失败了 -800
)
</script>
12.Promise.all和Promise.race
①all()里面传一个数组[]里面是promise的实例化对象,当数组全部为正确时,输出一个value数组
当某一个错误时,输出错误项的reason值
<script>
// 情况1:全部正确
let p1 = Promise.resolve('a')
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('b')
}, 500)
})
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('c')
}, 2000)
})
let arr = Promise.all([p1, p2, p3])
arr.then(
(value) => { console.log('正确:', value) }, // 2秒后输出:正确:["a", "b", "c"]
(reason) => { console.log('错误:', reason) }
)
// 情况2:有一个错误
let p1 = Promise.resolve('a')
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('b')
}, 500)
})
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('c')
}, 2000)
})
let arr = Promise.all([p1, p2, p3])
arr.then(
(value) => { console.log('正确:', value) },
(reason) => { console.log('错误:', reason) } //0.5秒后输出 :错误: b
)
</script>
②race()里面传的也是数组,但是输出只输出第一个运行的