解決回調地獄
//以往回調方式 函數1(function(){ //代碼執行...(ajax1) 函數2(function(){ //代碼執行...(ajax2) 函數3(function(data3){ //代碼執行...(ajax3) }); ... }); }); //Promise回調方式:鏈式調用,可構建多個回調函數。 //例如請求一個ajax以後,須要這個拿到這個ajax的數據去請求下一個ajax promise().then().then()...catch()
當頁面邏輯複雜起來的時候,管理起來特別不容易。
爲解決這種問題,CommonJS提出Promise概念.es6
//首先要建立Promise實例 let promise = new Promise( (resolve, reject) => { //執行相應代碼並根據狀況調用resolve或reject ... }) //在promise的then方法中執行回調 promise.then(function(){ //第一個參數是返回resolve時,回調執行的函數 },function(){ //第二個是回調返回reject時,回調執行的函數 } }
解釋一下上面幾個概念:ajax
Promise: Promise有三個狀態:pending(等待)、resolve(完成)、 reject(拒絕)
兩種狀態改變方式:pending => resolve, pending => reject
在構建Promise實例調用resolve或reject就是狀態改變的時候。當狀態改變的時候,其方法then就會執行對應狀態的回調函數。數組
resolve: then方法的第一個參數,一般做爲事件成功的回調函數promise
reject: then方法的第二個參數,一般做爲事件失敗的回調函數,也能夠做爲catch的參數出現瀏覽器
定時器調用
const promise = new Promise(function(resolve, reject){ setTimeout(resolve,1000);//1s後狀態變動爲resolve,調用then方法的第一個參數 }) promise.then(function(){ console.log('resolve:成功回調函數') },function(){ console.log('reject:失敗回調函數') })
const promise = new Promise((resolve, reject) => { setTimeout(reject,1000); }) promise.then( () => { console.log('resolve:成功回調函數') }).catch(() => { console.log('reject:失敗回調函數') })
const promise = new Promise((resolve, reject) => { setTimeout(reject,1000,'我是value值'); }) promise.then((value) => { console.log('resolve:' + value) }).catch((value) => { console.log('reject:'+ value) })
傳多個參數➡函數
//第一種,能夠看到單個傳值是無效的 const promise = new Promise((resolve, reject) => { setTimeout(resolve,1000,'參數1','參數2'); }) promise.then((value1,value2) => { console.log('value1:' + value1) //value1:參數1 console.log('value2:' + value2) //value2:undefined }).catch((value) => { console.log(value) })
//第二種:數組傳值 const promise = new Promise((resolve, reject) => { setTimeout(resolve,1000,['參數1','參數2']); }) promise.then((value1) => { console.log('value1:' + value1) //value1:參數1,參數2 }).catch((value) => { console.log(value) })
以上就是我對Promise的理解啦!是一些Promise入門的簡單知識點.
想深刻了解的話能夠看看阮一峯老師的《ES6入門》:
http://es6.ruanyifeng.com/#docs/promise3d