Promise对象
Promise是一个用于异步处理任务的对象, 可以将一个任务交给Promise对象, 该对象会异步执行这个任务,任务执行结束后。 可以通过这个promise对象的状态来判断该任务是否执行成功。并且,可以为这个对象设置成功和失败的回调函数,在回调时,它会携带成功的结果和失败的信息,作为这个回调函数的参数来执行回调。
每一个promise对象有三个状态,等待(pending),成功(fullfilled)和失败(rejected),一旦变为成功或者失败后,它状态将不会再被改变。
Promise对象实例化时时,参数为一个函数对象,该函数有两个参数,形参名分别为resolve和reject,在实例化完成后,内部函数将会被异步调用执行,调用时被注入两个函数对象作为实参(执行成功的回调函数和执行失败的回调函数),这两个函数分别被resolve和reject接受。所以,当我们调用resolve或者reject时,任务会结束,并分别返回成功和失败状态。
// 创建一个Promise对象,该对象内部传入一个函数用于执行 let myPromise = new Promise( function(resolve, reject){ // 向函数中注入两个函数,resolve调用表示成功,reject调用表示失败。 console.log('do sth----') resolve("successful") // 调用表示执行成功 })
setTimeout(()=>console.log(myPromise), 1000) // 一秒后查看promise执行情况
由于promise中调用的是 resolve("successful") ,所以返回的状态是成功,输出promise对象结果为 Promise { 'successful' } 如果调用 reject('error')将返回一个失败的状态,执行结果为Promise { <rejected> 'error' }
Pomise对象的方法
new = old.then(func(success), func(error)) | 返回一个新的promise对象,old这个promise对象完成后,执行then方法,成功调用第一个函数并传入成功值,失败调用第二个函数并传入失败值,这个new的状态根据由两个函数决定,成功执行了则成功,执行失败了则失败 |
new = old.catch(func(error)) | old失败后,将会执行catch,然后尝试使用func(error)处理这个失败,成功处理了,new为成功,处理失败,则new为失败 |
Promise.reject("msg") | 该promise失败并返回失败信息 |
Promise.resolve("msg") | 返回成功和成功信息 |
链式传递
调用promise对象的then方法会返回一个新的promise对象并同样的异步执行。这样可以作为一个链式传递。
let old = new Promise( (resolve, reject) => { // do something ... then resolve("this task is successful") // or reject('a error occured') } ) let new = old.then( (value) => {console.log(value); return 123}, (error) => {console.log(error); return 'error to success'} ) let new2 = new.then( (value) => {Promise.reject("new error")} // 成功时执行,但是返回一个错误 ).catch( (error) => {return 'success'} // 处理了这个失败 )
在上面的执行过程中,old
对象调用了resolve代表着成功完成了任务,执行old.then()时会调用成功回调,第一个参数中的函数,并返回成功和成功值123,new对象的状态为成功,并携带成功值123,new对象继续执行new.then(),由于状态为成功所以
执行第一个成功函数,但是在内部执行了Promise.reject(),则new2的状态为失败,并携带了失败值new error。
返回临时的promise对象,这个对象执行了catch方法,捕捉这个失败并处理。最后返回 成功结果给new2对象,new成功,成功结果为success。
old.then不管old成功和失败都将执行对应的处理函数,处理函数成功执行,返回新的对象就是成功的,处理函数失败,这个新的对象就将失败。新的对象可以继续执行then方法并指定回调函数,一直向下执行。
old.catch只会在old为失败的时候执行,返回一个新的Promise,catch成功执行了解决了这个错误,新对象为成功,否则为失败。成功不会执行catch,这个新对象直接继承原来的promise状态信息。