看多了寫的promise/async正面使用的文章,下面介紹幾種Promise特性帶來的幾個有趣的例子。 有點像物理實驗裏的永動機。。es6
下面這個例子,是由於resolve
回調函數的參數是promise
實例(下文簡稱N
),狀態就轉移到了N
上,直到N
狀態改變,timeout
的resolve
回調函數才執行回調promise
這裏也看出了promise使用的一個弊端,就是執行後,沒法取消。less
此處是Demodom
let i = 1
function timeout() {
let ms = Math.random() * 10 * 1000
return new Promise(resolve => {
setTimeout(function () {
console.log(`${i++} revoke of ${ms}`)
resolve(timeout())
}, ms)
})
}
timeout().then(ms => {
console.log('來到這裏是不能夠的,這輩子都不可能的')
})
複製代碼
// Sorry, promise執行後,就沒法取消了
複製代碼
下面直接一個promise
,並reject
,發現async
函數的then
是不會執行的async
async function waitless () {
return await Promise.reject(new Error('err'))
}
waitless().then(res => {
console.log('來到這裏是不能夠的,這輩子都不可能的')
})
複製代碼
promise
自身捕獲,從而不影響await
的後續執行函數
async function hava_a_catch() {
return await Promise.reject(new Error('err')).catch(e => e)
}
have_a_catch().then(res => {
console.log(res) // => undefined
})
複製代碼
async function waitless() {
return await Promise.reject(new Error('err'))
}
waitless().then(res => {
console.log('我在這裏孤憐憐的等着,直到世界盡頭...')
}).catch(e => {
console.log('恩,我在這裏輸出了')
})
複製代碼
以上都是看阮老師《ES6入門》,而後總結出來的。 而後果真是promise的使用上是不難的,就是錯誤獲取有點繞。 特別是promise.then返回的是一個新的promise,promise.catch返回的也是新的promise。catch以後,這個新的promise的狀態就是乾淨的了 promise還能夠鏈式調用,最後一個catch能夠捕獲前面全部的錯誤。 再加上promise能夠吃掉內部的報錯,不影響JS的執行。 還有Promise.all的調用,好幾個promise執行,其中一個reject了怎麼辦,在哪一個地方捕獲,最好的方案是子promise自身捕獲,仍是all回調捕獲呢?其實這個是要根據場景來的。ui
總之,阮老師的教程裏都有講到,你們細心、耐心的看下去就確定能夠了解到promise設計的是有多周到了spa
參考:.net
async函數:async設計
promise函數:promise