[TOC]
>[success] # ES6 Promise解決異步代碼
~~~
'Promise'是一個'構造函數',他有一個參數,參數的類型為'Function'類型,這個function有2個參數,
一個是'resolve表示成功'的返回值,另一個是'reject表示失敗'的回調函數。
~~~
<br/>
>[success] ## 基礎用法
封裝時候這么寫:
~~~
變量寫法:
let promise = new Promise((resolve, reject) =>{
api(parameter).then(res => {
// 成功就把res返回出去
resolve(res)
}).catch(e =>{
// 失敗就返回錯誤,可以直接這樣寫,new Error(' 報錯了 ')
reject(new Error(e))
})
})
函數寫法:
function promise (){
return new Promise((resolve, reject) =>{
api(parameter).then(res => {
// 成功就把res返回出去
resolve(res)
}).catch(e =>{
// 失敗就返回錯誤,可以直接這樣寫,new Error(' 報錯了 ')
reject(new Error(e))
})
})
}
~~~
調用時候這么寫:
~~~
// 變量寫法這樣調用
promise.then(res =>{
// 這里寫成功時候要執行的代碼
}).catch(e =>{
這里寫失敗時候要執行的代碼
})
// 函數寫法這樣調用
promise().then(res =>{
// 這里寫成功時候要執行的代碼
}).catch(e =>{
這里寫失敗時候要執行的代碼
})
~~~
<br/>
>[success] ## 用Promise解決異步問題
~~~
下面的代碼就是一個經典的'異步'問題,我們期望的是先打印出'呵呵噠',后打印'嘎嘎',實際上相反。
~~~
~~~
setTimeout(() => {
console.log('呵呵噠')
},500)
setTimeout(() => {
console.log('嘎嘎')
},300)
打印結果:
// '嘎嘎'
// '呵呵噠'
~~~
<br/>
>[success] ### 用.then的鏈式寫法解決異步問題
~~~
首先封裝2個'Promise'方法,'Fun1'和'Fun2'
~~~
~~~
function Fun1(){
return new Promise((resolve, reject) => {
setTimeout(function(){
console.log('呵呵噠')
resolve(1)
},500)
})
}
function Fun2(){
return new Promise((resolve, reject) => {
setTimeout( function(){
console.log('嘎嘎')
resolve(2)
},300)
})
}
~~~
調用時這樣寫:
~~~
function Fun3(){
Fun1().then(res => {
return Fun2()
}).then(res => {
// 執行要執行的代碼
}).catch(e => {
// 只要Fn1報錯了就錯誤就會直接拋到這里
})
}
Fun3()
打印結果:
// 呵呵噠
// 嘎嘎
~~~
<br/>
>[success] ### 用ES7 async 和 await來解決異步
es7的寫法很簡潔,很方便。
~~~
async function Fun3(){
try{
let res = await Fun1()
let res2 = await Fun2()
} catch (e) {
// 只要Fn1報錯了就錯誤就會直接拋到這里
}
}
~~~
- Javascript基礎篇
- Array數組
- 數組插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向對象思想
- Javascript 面向對象編程(一):封裝
- Javascript面向對象編程(二):構造函數的繼承
- Javascript面向對象編程(三):非構造函數的繼承
- 解構
- 數組的解構賦值
- 對象的解構賦值
- 函數參數解構
- 字符串的解構賦值
- 數值和布爾值的解構賦值
- 圓括號問題
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初識遞歸
- 渲染ul-li樹形結構
- 異步函數解決方案
- 1. callback回調函數
- 2. ES6 - Promise
- JavaScript高級程序設計(書)
- 在html中使用JavaScript
- script標簽的位置
- 延遲腳本
- 異步腳本
- <noscript>元素
- 基本概念
- 嚴格模式
- 變量詳解
- 數據類型
- typeof操作符
- undefined類型
- Null類型
- Boolean類型
- Number類型
- 深入了解ES6(書)
- var 、let 、 const
- 字符串與正則表達式
- 字符串
- 正則表達式
- 函數
- 函數形參默認值
- 使用不具名參數
- 函數構造器的增強能力
- 擴展運算符
- name屬性
- 明確函數的多重用途
- 塊級函數
- 箭頭函數
- 尾調用優化
- 擴展的對象功能
- 對象類別
- 對象字面量語法的擴展
- ES6對象新增方法
- 重復的對象屬性
- 自有屬性的枚舉順序
- 更強大的原型
- 解構:更方便的數據訪問
- 為什么要用解構?
- 對象解構
- 數組解構
- 混合解構
- 參數解構
- Symbol與Symbol屬性
- 創建Symbol
- Symbol的使用方法
- Symbol全局私有屬性
- Symbol與類型強制轉換
- Symbol屬性檢索
- Symbol的一些構造方法
- Set集合與Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS標準內置對象
- Object 構造函數及屬性
- Object 構造方法
- Symbol 內建對象類的函數及屬性
- Set 構造函數及屬性
- Weak Set 構造函數及屬性
- JS雜項
- 類數組對象
- Class類的理解和使用