就是一種異步編程的的解決方案編程
當執行網絡請求的時候,代碼就會出現阻塞,下面的代碼要等待請求完成了在運行,因此咱們通常網絡請求的時候就去開啓一個異步任務,一邊請求一邊執行其餘代碼promise
請求到數據後,就要一個回調函數,返回數據網絡
這只是簡單的場景,若是在很複雜的情景裏就會出現回調地獄。。。。。。異步
爲了解決這個問就有了Promise,很優雅的就能夠解決問題,調用請求和數據的處理放在不一樣的 位置上異步編程
new Promise((resolve, reject) => { setTimeout(() => { //延時函數模擬請求 resolve() }, 1000) }).then(() => { console.log(111); //模擬處理數據 return new Promise((resolve, reject) => { setTimeout(() => { resolve() 經過數據再請求 }) }) }).then(() => { //再處理拿到的數據 console.log(222); })
這就是鏈式編程 一條鏈處理一條鏈的事情函數
1 pending 等待 正在請求 spa
2. fulfill 知足 調用 resolvecode
3.reject 拒絕狀態 調用 rejectblog
咱們能夠看到 then 能夠傳 兩個函數 一個 是fulfill ,一個reject ,就是說 在then中能夠這樣寫回調函數
.then(res => { console.log(222); }, err => { console.log(err); })
這樣catch就能夠不用寫在then後面 直接寫在then裏面
new Promise((resolve, reject) => { setTimeout(() => { resolve('Hello World') }, 1000) }).then(res => { console.log(res); return Promise.resolve(res + '11') }).then(res => { return Promise.resolve(res + '22') }).then(res => { return Promise.resolve(res + '22') }).then(res => { return Promise.resolve(res + '22') }).then(res => { return Promise.resolve(res + '22') }).then(res => { return Promise.resolve(res + '22') }).then(res => { return Promise.resolve(res + '22') })
調用 時能夠直接寫這樣
之前的這樣太過於麻煩:
return new Promise((resolve, reject) => { setTimeout(() => { resolve() 經過數據再請求 }) })
直接return res +‘ 222’
直呼 程序‘偷懶’真是個好習慣 :)
這裏即有一個函數Promise.all([])
Promise.all([ new Promise((resolve, reject) => { setTimeout(() => { resolve({ name: 'kobe', age: 18 }) }, 1000); }), new Promise((resolve, reject) => { setTimeout(() => { resolve({ name: 'kobe', age: 18 }) }, 1000); }) ]).then(res => { console.log(res); }).catch(err => { console.log(err); })