promise目的就是为了跳出回调地狱.老掉牙的东西,大神轻拍.
举个最简单的例子:请求数据(getData),解析数据(executeData),显示数据(showData).
//获取数据 function getData(callback){ callback && callback(); } //解析数据 function executeData(callback){ callback && callback(); } //显示数据 function showData(callback){ callback && callback(); } //开始请求数据了 getData(function(){ executeData(function(){ showData(function(){ console.log("data showed"); }) }) })
传统做法就是这样,当然也可以通过事件机制实现。事件机制相比于回调,回调是一对一,事件机制就是一对多。但是,缺点就是代码极难阅读,尤其是混淆了复杂的业务逻辑,写代码注释都很难补救。
这时候promise出场了.
//获取数据 function getData(){ var deferred = $q.defer();//创建一个延迟 //do something setTimeout(function(){ deferred.resolve(); //延迟执行完毕,没问题啊 },1000); return deferred.promise;//返回promise,我给你个承诺,你等着 } //解析数据 function executeData(type){ var deferred = $q.defer(); //do something setTimeout(function(){ deferred.reject();//出事了,数据不对 },1000); return deferred.promise; } //显示数据 function showData(){ var deferred = $q.defer(); //do something deferred.notify();//持续发送消息,gogogogo,用来更新进度什么的 return deferred.promise; } //马上帅多了 getData() .then(executeData.bind(window,["test"]))//通过bind修改参数 .then(showData) .catch(function(){ //中途运行deferred.reject的话,就触发catch console.log("error"); }) .finally(function(){ //全部执行完就finally console.log(end); });
上面注释相信写得很清楚了。可以使用bind自定义参数。还有$q.all([promise1,promise2,promise3])可以同时执行多个promise,跟执行顺序跟上面有区别。
为什么叫做$q,$q的全称是什么,知道的请@死我。