Promise
Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。
简单说,就是处理异步请求的。
之所以叫做Promise,就是我承诺,如果成功则怎么处理,失败则怎么处理。
new Promise( /* 下面定义的函数是executor */ function(resolve, reject) {...} );
executor
executor 是一个带有 resolve 和 reject 两个参数的函数 。
executor 函数在Promise构造函数执行时同步执行,被传递resolve和reject函数(executor 函数在Promise构造函数返回新建对象前被调用)。
executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled即完成,或者在发生错误时将它的状态改为rejected即失败。
如果在executor函数中抛出一个错误,那么该promise 状态为rejected。executor函数的返回值被忽略
executor中,resolve或reject只能执行其中一个函数
Promise的状态
pending: 初始状态,不是成功或失败状态。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失败
Promise.then(onFulfilled, onRejected)
参数是2个函数,根据Promise的状态来调用不同的函数,fulfilled走onFulfilled函数,rejected走onRejected函数。
then的返回值是一个新的promise对象。调用任何一个参数后,其返回值会被新的promise对象来resolve,向后传递。
var myPromise = new Promise((resolve,reject) => { //resolve("ok"); //执行,置状态为fulfilled console.log("++++++++++++"); reject("bad") // 永远执行不到,resolve和reject只能执行其一 console.log("===============") }); console.log("myPromise") myPromise.then( (value) => console.log(1,myPromise,value), // 成功,显示结果 (reason) => console.log(2,myPromise,reason) // 失败,显示原因 )
catch(onRejected)
为当前Promise对象添加一个拒绝回调,返回一个新的Promise对象。onRejected函数调用其返回值会被新的Promise对象用来resolve。
var myPromise = new Promise(function(resolve, reject) { setTimeout(() => { // resolve("ok"); //执行其一 reject("not ok") //执行其一 },1000) }) console.log(myPromise) // 状态pending myPromise.then( // 根据Promise的状态,选择走那个函数 (value) => { console.log(1,myPromise,value) return value // 如果不return,返回的新promise对象,只是简单地接受了本次promise对象的终态 }, (reason) => { console.log(2,myPromise,reason) return reason } ).then( function(x) { console.log(x); //x上一个Promise对象返回的值 return Promise.reject(x +"+++++++") } ).catch(x => { // 接收到的是上一个reject的值,在这里被Promise的resolve使用 console.log(x); return Promise.resolve(x) })
setTimeout函数是一个异步函数,设置的值为要执行的函数和等待时常,2000就是2秒
异步实例
var myPromise = new Promise((resolve,reject) => { //resolve("ok"); //执行,置状态为fulfilled console.log("++++++++++++"); reject("bad") // 执行 console.log("===============") }); console.log("myPromise") abc = (myPromise.then( (value) => { console.log(1,myPromise,value) // 成功,显示结果 return value }, (reason) => { console.log(2,myPromise,reason) // 失败,显示原因 return reason } ).then( function (v) { console.log(2.5,v) return Promise.reject(v + "**") } ).catch(reason => { console.log(3,reason); return Promise.resolve(reason) })) setTimeout(() => console.log(100,abc),2000) // 返回的对象仍是promise对象, Promise<"bad**">
参考
Promise
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
then
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
catch:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch