简介
- ES6将某一件事情可以发生异步的时候,分为2ge阶段unsettled未决阶段和settled已决阶段 事情总是从未决阶段逐步发展到已决阶段,并且未决阶段有控制通往已决阶段的能力,可以决定事情最终走向的状态
- ES6将程序分为3中状态:pending resolved rejected pending状态:挂起(等待) 处于未决阶段,表示事情还在挂起最终的结果还没有出现 resolved状态:已处理 处于已决阶段,表示整个事情已经出现了结果,并且可以按照正常的逻辑进行下去的结果 rejected状态:已拒绝 处于已决阶段,表示整个事情已经出现了结果,并且无法按照正常的逻辑进行下去的结果
- 把事情从pending状态推向resolved状态的过程中可能会传递一些数据,这些数据一般为真实有效数据 把事情从pending状态推向rejected状态的过程中可能会传递一些数据,这些数据一般为错误信息
- 当事情已经到达已决阶段后,通常要进行后续处理,不同的已决阶段,决定了不同的后续处理 resolved 这是一个正常的已决状态,后续处理表示为thenable rejected 这是一个非正常的已决状态,后续处理表示为catchable 后续处理可能会有多个,因此就会形成任务队列,这些后续处理会按照顺序,当到达对应的状态依次执行
使用 new 来创建一个promise对象
Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」
resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
Promise的API
then()方法
then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数
而 Promise 的优势就在于这个链式调用。我们可以在 then 方法中继续写 Promise 对象并返回,然后继续调用 then 来进行回调操作
reject()方法:
我们通过 resolve 方法把 Promise 的状态置为完成态(Resolved),这时 then 方法就能捕捉到变化,并执行“成功”情况的回调。
而 reject 方法就是把 Promise 的状态置为已失败(Rejected),这时 then 方法执行“失败”情况的回调(then 方法的第二参数)
回调函数使用
//实例生成后用then方法指定相应状态对应的回调函数
promise.then(function(success) {
//success
}, function(error) { //第二个为可选参数,可不写
//failure
})
// then的链式调用: promise.then() 返回的也是一个promise对象, 也具有两个状态
promise.then(function(success) {
return 'name'; //前一个then方法的返回值传给下一个then作为参数
}).then(function(name) { //获取上一个then传来的name
console.log(name);
}, function(error) { //错误时进行调用
console.log('rejected');
})
// Promise本质上就是一个构造函数
const pro = new Promise(function(resolve, reject) {
// 1.未决阶段 同步代码
// 通过调用resolve函数将promise从pending状态推向resolved状态
// 通过调用reject函数将promise从pending状态推向rejected状态
// 2.resolve和reject只能使用一个,如果使用多个,也只有第一个有用
// 3.传递的参数只能有一个,表示推向出去的数据
// reject("!")
resolve([true, "123"])
})
console.log(pro)
pro.then(function(data) {
// thenable resolve推出的结果
console.log(data)
}, function(err) {
// catchable reject退出的结果
console.log(err)
})