由于JavaScript的事件机制,很多场合需要异步回调,有些情况下会有多层的回调嵌套,代码风格不可避免偏向于“意大利面条式”,非常不优雅。
$.get(URL1, function(data) {
$.get(URL2, function(data) {
$.get(URL3, function(data) {
doSomething();
});
});
});
并且下面的代码,为了获取渲染表格的数据,需要两次异步请求:
var model = {};
function finish() {
if (model.data1 && model.data2) {
renderTable(model.data1, model.data2);
}
}
$.get(URL1, function(data) {
model.data1 = data;
finish();
});
$.get(URL2, function(data) {
model.data2 = data;
finish();
});
把上面的两端代码,如果写成下面这样,逻辑是不是变简单很多了?
var ajax1 = $.get(URL1);
var ajax2 = $.get(URL2);
when(ajax1, ajax2).then(function (data1, data2) {
renderTable(data1, data2);
});
第二段代码如下:
$.get(URL1)
.then(function (data) {
return $.get(URL2 + '?name=' + data);
})
.then(function (data) {
return $.get(URL3 + '?name=' + data);
})
.then(function (data) {
doSomething(data);
});
没错,上面的两端代码就是使用了Promise模式:得到一个当前未完成操作的对象(将来某时会完成),并可立即对其进行直接操作。