Promise
翻譯過來就是承諾的意思,這個承諾會在未來有一個確切的答復,並且該承諾有三種狀態,分別是:
- 等待中(pending)
- 完成了 (resolved)
- 拒絕了(rejected)
這個承諾一旦從等待狀態變成為其他狀態就永遠不能更改狀態了,也就是說一旦狀態變為 resolved 后,就不能再次改變
new Promise((resolve, reject) => { resolve('success') // 無效 reject('reject') })
當我們在構造Promise
的時候,構造函數內部的代碼是立即執行的
new Promise((resolve, reject) => { console.log('new Promise') resolve('success') }) console.log('finifsh') // new Promise -> finifsh
Promise
實現了鏈式調用,也就是說每次調用then
之后返回的都是一個Promise
,並且是一個全新的Promise
,原因也是因為狀態不可變。如果你在then
中 使用了return
,那么return
的值會被Promise.resolve()
包裝
Promise.resolve(1) .then(res => { console.log(res) // => 1 return 2 // 包裝成 Promise.resolve(2) }) .then(res => { console.log(res) // => 2 })
當然了,Promise
也很好地解決了回調地獄的問題,可以把之前的回調地獄例子改寫為如下代碼:
ajax(url) .then(res => { console.log(res) return ajax(url1) }).then(res => { console.log(res) return ajax(url2) }).then(res => console.log(res))
前面都是在講述Promise
的一些優點和特點,其實它也是存在一些缺點的,比如無法取消Promise
,錯誤需要通過回調函數捕獲。