Promise/Deferred模式最早出现在jQuery1.5版本,在该版本几乎重写了Ajax部分,使得Ajax成链式表达式。
$.get('/api')
.success(onSuccess)
.error(onError)
.complete(onComplete)
异步的广度使用使得回调、嵌套出现,但是一旦出现深度嵌套,就会让编程体验变得不愉快,回调地狱,而Promise/Deferred模式在一定程度上缓解了这个问题。
回调地狱:
var fs = require('fs');
fs.readFile('zhang/index.js','utf-8',function (err,data) {
console.log(data);
fs.readFile('zhang/main.js','utf-8',function (err,data) {
console.log(data);
})
})
使用es6的Promise:
var fs = require('fs');
var p1 = new Promise(function (resolve) {
fs.readFile('zhang/index.js','utf-8',function (err,data) {
resolve(data);
})
});
var p2 = new Promise(function (resolve) {
fs.readFile('zhang/main.js','utf-8',function (err,data) {
resolve(data);
})
});
Promise.all([p1, p2]).then(function (result) {
console.log(result);
});