前言
谈到Promise,大家都熟烂于心,有的童鞋已经在项目中大规模使用async/await,甚至有的开始用上了fetch。无论什么方式,实质都是Promise的封装和语法糖,所以弄清楚了Promise的来龙去脉,有助于更好地理解和使用Promise。
历史演变
- callback
- observers
- JSDeferred
- jQuery Deferred
- Promise(*)
- generator
- async/await
- fetch
callback

const fetchApi = (callback) => {
setTimeout(() => {
//todo something...
callback && calback();
}, 1000);
};
fetachApi(() => {
//some code...
});
这样虽然可以解决问题,但是还存在以下几个问题:
- 代码易读性差
- 代码不紧凑
- 依然会有callback hell问题
observers
观察者模式,jQuery三行代码搞定发布订阅模式
//订阅
$.on(document, function() {
});
//取消订阅
$.off(document, function() {
});
//发布
$.trigger(document, function() {
});
listeners
EventEmitter
const EventEmitter = require('Event.EventEmitter');
const eventEmitter = new EventEmitter();
eventEmitter.on('data', () => {
//some code...
});
eventEmitter.emit();
DOM事件
document.onclick = function() {
//some code...
}
jQuery事件绑定
$(document).on('click', function() {
//some code...
})
JSDeferred
Promise里程碑,在Promise还没形成规范之前,各大库(mochikit,dojo,jQuery...)百花齐放,都实现了各自的Promise模型。
jQuery Deferred
Promise先驱者,前端新人可能对jQuery比较熟悉,在平时的工作中,据我所知,我身边的前端童鞋几乎都不知道这个jQuery的这个api。其实早在Promise诞生前,jQuery内部已经实现Promise类似功能,只是没有成为规范被纳入。
$.Deferred
$.when()
Promise
这个是本文讲述的重点
const promise = new Promise((resolve, reject) => {
if (data) {
resolve(data);
}else {
reject(error);
}
});
promise.then(data => {
//some code...
});
Promise.all([fetchApi1, fetchApi2]);
Promise.trace([fetchApi1, fetchApi2]);
generator
迭代器模式, async/await过渡产品
const loginHandler = *() => {
yield fetchApi();
}
loginHandler.next();
async/await
像写同步代码一样书写异步代码
const loginHandler = async () => {
const data = await fetchApi();
//do something with data...
};
fetch
未来的ajax
fetach(apiUrl, data => data.json() => data )
.then(data => {
//some code...
});