title: ES6中的Promise
一. 提要
为解决传统异步所造成的回调地狱,社区提出了Promise
方案并最终将其写入了语言标准。其用法如其名——承诺:即非立即兑现,通过then
方法调用其状态,通过catch
捕获错误。
二. 状态
Pending
:进行中Fulfilled
:已成功Rejected
:已失败
Promise
的另一个特性是无法改变。正如其英文寓意一样,一旦状态改变就无法继续更改。故我们将Fulfilled
和Rejected
统一称为Resolved
(已定型)
三. 缺点
当然Promise
也有一些缺点:
- 一旦创建立即执行,无法中途取消。
- 若不设置回调函数则其内部错误不会抛向外部
Pending
状态时无法知道目前进展到哪一阶段(开始或即将完成)
四. 用法
var p = new Promise((resolve, reject)=>{
console.log('Create a Promise')
resolve('success')
})
console.log('After new Promise')
p.then(val=>{
console.log(val)
})
// Create a Promise
// success
// After new Promise
// Promise {<resolved>: undefined}
如图,我们创建promise
时其会立即执行,一旦状态发生改变那么立即调用then
方法中的函数。
没看出来?咱们加个定时器试试
function timeout(ms){
return new Promise((resolve, reject)=>{
console.log('Running Immediately')
setTimeout(resolve, ms, 'done')
})
}
timeout(100).then(val=>{
console.log(val)
},err=>{
console.log(err)
})
// Running Immediately
// Promise {<pending>}
// done
看到了吧,只要状态一旦改变那么会立即执行then
方法。我们平日所写的ajax
函数从此也再不需要进行嵌套回调了
var getJSON = (url)=>{
var promise = new Promise((resolve, reject)=>{
var client = new XMLHttpRequest