Promise 是 ES6 中很是重要的概念。相較於回調函數和事件監聽,Promise 能夠更好的解決了異步編程中遇到的問題。vue
Promise 是 ES6 新引入的對象。使用 Promise 封裝一個異步過程,避免了使用回調函數,鏈式調用讓代碼更加清晰。git
Promise 對象是個構造函數,經過 new 建立一個 Promise 實例。github
const promise = new Promise((resolve, reject) => {})複製代碼
一個 Promise 對象有 3 種狀態:ajax
執行 Promise 回調中的 resolve 與 reject 函數改變 Promise 對象的狀態。編程
使用 Promise 實現一個簡單的 ajax 函數是個很是好的例子。promise
// 封裝 XMLHttpRequest
funtion ajax () {
return new Promise((resolve, reject) => {
var req = new XMLHttpRequest()
req.onreadystatechange = function () {
if (this.readyState === XMLHttpRequest.DONE) {
if (this.status === 200) {
resolve(this.responseText)
} else {
reject(new Error('ajax error'))
}
}
}
req.open('GET', '/url')
req.send()
})
}
// 調用
ajax().then(res => {
// ajax 成功以後的 responseText
}).catch(err => {})複製代碼
resolve 與 reject 函數調用時的能夠傳遞參數,在 Promise 實例以後的 then 與 catch 回調中能夠獲取到這些參數。這樣的話,即可以對異步過程傳遞出的信息作出相對應的處理。app
pending
,點擊取消以後對應
rejected
,點擊肯定以後對應
fulfilled
。因此咱們能夠編寫一個名 爲 confirm 的函數 ,這個函數實現兩個功能:
那麼就能夠在調用 confirm 函數以後的 then 與 catch 中針對不一樣的操做作出相應的處理。
下面的僞碼描述了這個過程。異步
confirm().then(() => {
// 點擊了 肯定
}).catch(() => {
// 點擊了 取消
})複製代碼
按照這個思路,咱們來一步步實現這個 confirm 函數。異步編程
Confirm 組件相似於一個彈出層,其中的內容區域須要居中顯示。使用 fixed 絕對定位 與 flex 佈局能夠實現。完整的代碼點擊這裏。函數
實現的 confirm 的一些要點:
import Vue from 'vue'
let currentMsg = null
let instance = null
const ConfirmConstructor = Vue.extend(require('./Index.vue'))
function confirm (option = {}) {
instance = new ConfirmConstructor({
el: document.createElement('div')
})
// ...
// 彈出層再次隱藏時時銷燬組件
instance.$watch('display', function (val) {
if (!val) {
instance.$destroy(true)
instance.$el.parentNode.removeChild(instance.$el)
}
instance.callBack = defaultCallBack
document.body.appendChild(instance.$el)
// 顯示
instance.display = true
return new Promise((resolve, reject) => {
currentMsg = { resolve, reject }
})
})
}
function defaultCallBack (action) {
// ...
if (action === 'confirm') {
currentMsg.resolve('confirm')
} else {
currentMsg.reject('cancel')
}
}
export default confirm複製代碼
在須要的時候,導入 confirm 函數,經過鏈式調用便可。
完成的代碼片斷點擊這裏。
本文簡單介紹了一下 Promise 的概念,而且應用 Promise 實現了一個簡單的 confirm 函數。從以上例子能夠看出,對於一些異步操做, Promise 是一個很是好的工具。但願你們能掌握它的用法。