Promise相关
- 1.Promise的概述
- 2. Promise的状态
- 3. Promise对象的创建方式
- 4. Promise#then 方法的特点
- 5. Promise 链式调用
- 6.Promise.resolve 传入的参数类型
1.Promise的概述
Promise实例一旦被创建就会被执行
Promise过程分为两个分支:pending => resolved和pending => rejected
Promise状态改变后,依然会执行之后的代码:
let warnDemo = ctx => { let promise = new Promise(resolve => {
resolve(ctx); console.log("After resolved, but Run"); // 依然会执行这个语句
}); return promise;
};
warnDemo("ctx").then(ctx => console.log(`This is ${ctx}`));
2. Promise的状态
resolve : 将 Promise的状态设置为 fullfilled (已成功)
reject : 将 Promise 的状态设置为 rejected (已失败)
Promise 的状态 一旦改变, 不可更改。
下面是代码演示:
let promise = new Promise((resolve, reject) => {
//未完成
reject("您失信了")
//完成
resolve("已经买过房子了")
})
console.log(promise)
3. Promise对象的创建方式
创建Promise对象有三种方式
- new Promise((resolve, reject) => {} ) :promise 的状态由回调函数来进行切换。
- Promise.resolve(data) : 快速构建一个 fulfilled 状态的 promise。
- Promise.reject(data) :快速构建一个 rejected 状态的 promise。
4. Promise#then 方法的特点
在resolve和reject都有的情况下,reject是不执行的。
then 会重新返回promise,两个函数,一个返回rresolve 一个返回reject。
var p1= new Promise(function (resolve, reject) {
resolve({
data: [1, 2, 3, 4],
resposneCode: "00001",
resposneRemark: "成功"
})
reject({
resposneCode: "00000",
resposneRemark: "失败,遇到网络问题",
data: [2]
})
}).then(function ({ data }) { return { data } }, function ({ data }) { return { data } });
p1.then(function (data) { console.log(data) }, function ({ data }) { return { data } });
5. Promise 链式调用
then :
1. 处理 承诺 已完成的 业务
2. 更改 返回的 新的 promise 对象的状态
3. then 方法会返回一个 新的 promise 对象
4. then 方法的回调函数如果能被执行, 新的 promise 对象 状态由 回调函数 确定
- 如果回调函数产生异常, 则返回 rejected 状态的 promise
- 如果回调函数 没有 return ,则 返回 fulfilled 状态,并将 undefined 作为参数传给新的promise
- 如果回调函数 return 普通数据、则将 普通数据 作为 resolve 的 参数传给新的 promise
- 如果回调函数 return 一个 promise 对象,则then 返回的新的promise 对象状态和 return
的promise对象状态完全一致
5.then 方法的回调函数如果不能执行,新的 promise 对象 和 调用 then 方法的 promise状态 完全一致
let th = p.then( res => {
console.log(res)
// 回调函数 return 的结果,会默认作为 fulfilled状态的 resolve() 函数的参数
throw "error2" ;
})
console.log(th, "outter")
setTimeout(function() {
console.log(th, "timeout")
console.log(th === p)
} , 0)
6.Promise.resolve 传入的参数类型
Promise.resolve(arg) 快速的创建一个状态为 fulfilled的 promise
arg 参数的类型满足以下条件:
- arg是一个普通数据,会构建一个 fulfilled状态的 promise,并将 arg 的值 作为 resolve的参数
- arg 是 undefined, 会将 undefined 作为 resolve的参数,并返回 fulfilled状态的
promise - arg 是一个 thenable(某个对象中有 then 方法) 对象, 那么 会直接执行 then 方法,
返回的promise对象状态由 then函数来确定 - arg 是一个promise 对象, 那么会返回一个 和 arg promise对象状态完全一致的 promise
以下是代码演示:
arg是一个普通数据:
Promise.resolve(arg) //快速的创建一个状态为 fulfilled的 promise
arg是undefined:
Promise.resolve().then(res=> console.log(res))
arg是一个thenable对象:
let obj = {
name: "zhangsan",
then() {
//console.log(this.name, "在说话")
throw Error("error")
}
}
let p = Promise.resolve(obj)
setTimeout( function(){
console.log(p)
}, 0)
arg是一个promise 对象:
let p = new Promise((resolve, reject)=> {
reject("ok")
})
let p2 = Promise.resolve(p)
setTimeout(function(){
console.log(p2)
})