Promise對象用於一個異步操做的最終完成(包括成功和失敗)及結果值的表示。promise
簡單說,就是處理異步請求的。異步
之因此叫作Promise,就是我承諾,若是成功則怎麼處理,失敗則怎麼處理。函數
new Promise( /* 下面定義的函數是executor */ function(resolve, reject) {...} );
executor 是一個帶有 resolve 和 reject 兩個參數的函數 。spa
executor 函數在Promise構造函數執行時同步執行,被傳遞resolve和reject函數(executor 函數在Promise構造函數返回新建對象前被調用)。code
executor 內部一般會執行一些異步操做,一旦完成,能夠調用resolve函數來將promise狀態改爲fulfilled即完成,或者在發生錯誤時將它的狀態改成rejected即失敗。對象
若是在executor函數中拋出一個錯誤,那麼該promise 狀態爲rejected。executor函數的返回值被忽略blog
executor中,resolve或reject只能執行其中一個函數ip
pending: 初始狀態,不是成功或失敗狀態。get
fulfilled: 意味着操做成功完成。同步
rejected: 意味着操做失敗
參數是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) // 失敗,顯示緣由 )
爲當前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