promise是用来解决异步编程的书写问题。在使用js时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会造成代码的书写困难和可读性差等问题,这种情况也被称为回调嵌套地狱。
Promise解决了回调嵌套地狱的问题。使得可以使用顺序书写(而非嵌套书写)的方式,实现回调的嵌套。简化了代码的书写难度,同时提高了代码的可读性。
Promise构造函数
Promise构造函数,接受一个函数参数,参数会在构造函数内被调用,且会被传入resolve和reject两个方法,这2个方法用来改变实例的状态,然后就可以触发实例then方法中注册的成功和失败回调,同时给回调传入参数
promise实例
promise实例有3种状态,等待(或者说进行中),成功,失败。以及then,catch方法。then方法用于注册成功和失败时的回调,catch方法用于注册失败时的回调,它们返回的依然是promise实例,以便链式调用,或者顺序书写。promise实例改变状态后,触发相应回调,该过程是微异步过程。
then方法
假设有promise实例a,当使用a.then(function h(){},function t(){})方法来注册回调时,同时其也返回了一个新的promise实例(假设为b)
a实例的状态从等待, 变为成功或者失败时, 会触发相应的成功或失败回调。这里假设a实例的状态变为了成功,则触发h回调,如果h的返回值是非promise实例, 则会自动执行b的resolve方法,并传入返回值。但如果h的返回值是一个promise实例(假设为c),则表现出的结果为状态关联,c的reject执行,则b的reject执行,并接收c的reject传入的参数;c的resolve执行,则b执行resolve,并接收c的resolve传入的参数;c实例状态如果为等待,则b不触发
demo
//promise的then回调触发是微异步过程
//then回调返回常规值案例
let a = new Promise((resolve, reject) => {
setTimeout(()=> {
resolve(100)
}, 5000)
});
let b = a.then((arg) => { //成功回调
return arg + 100
});
b.then((arg) => { //成功回调
console.log(arg) //5秒后打印,200
})
//then回调返回promise案例
let a = new Promise((resolve, reject) => {
setTimeout(function() {
resolve(100)
}, 5000)
});
let b = a.then((arg) => { //成功回调
let c = new Promise((resolve, reject) => {
setTimeout(function() => {
resolve(art + 100)
}, 5000)
})
return c
});
b.then((arg) => { //成功回调
console.log(arg) //10秒后打印,200
})
网友评论