如果要实现一个并发的异步操作,执行A、B、C三件事情,但是又要按照顺序来执行,先A再B再C的顺序。
以前做法:
$.ajax({ url: "A.html", context: document.body, success: function(){
//这里是A事情,先执行
$.ajax({ url: "B.html", context: document.body, success:function(){
//再A回调中执行B,也就是A完成以后执行B
$.ajax({ url: "C.html", context: document.body, success: function(){
//在B回调中执行C
}});
}});
}});
有没有发现,这种处理代码必须是层层嵌套,如果层次一多,简直要命。
Promise帮我们解决这个问题:
var Request = function(name) {
return new Promise(function(resolve, reject) {
$.ajax({ url: name , context: document.body, success: function(){
//在B回调中执行C
}});
});
};
Request("A.html") // 执行A,然后...
.then(function() { return Request("B.html"); }) // 执行B,然后...
.then(function() { Request("C.html"); }) // 执行C,然后...
有没有发现Promise的作用,既可以不用层层嵌套,又可以保证异步执行的A、B、C的执行顺序。
注意:resolve()千万别忘记写了,它是给Promise的一个反馈;then中一定要return 一个Promise的对象才能有下一个then函数。