今天就跟大家聊聊有关使用角怎么实现异步变同步处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
<强> 1。背景强>
在前端项目中,经常会遇到页面有多个接口,后一个接口参数需要从前一个接口的返回数据中获取,这就存在接口必须按顺序一个一个执行。而角提供的Http服务请求接口都是异步请求,因此通常情况下会写成如下的代码:
funA (__arg1、最长、功能(){ ,funcB (__arg1、最长、功能(){ funcC才能(__arg1、最长、功能(){ ,,,xxxx .... })才能 })大敌; });
这不仅造成页面代码混乱不易维护,也让开发者无法追踪代码的运行。本身嵌套就已经不容易理解,加上不知何时才能触发回调,这就相当于雪上加霜。
<强> 2。承诺强>
针对这中现象,角推出了承诺规范,它可以帮助开发者将异步变成同步,是一种对执行结果不确定的一种预先定义,例如以下代码中,当getData方法内的对象成功执行,就会调用成功的方法,如果失败,就会调用错误方法。另外承诺除了然后方法之外,还有赶上最后()与()方法。
推迟只getData () 不要犹豫(,funcSuccess () {},, funcError () {},) .catch(,函数(){}) 最后(,函数(){});
最后()方法一般用来处理不管承诺是返回成功还是失败,都会执行的操作,例如离子中的上拉加载,当获取数据后不管成功或者失败,都要广播结束这次上拉操作,便可将这个操作写在最后()方法中。
<强> 3。美元问服务强>
服务是AngularJs中自己封装实现的一种承诺实现,一般有如下三个常用方法:
推迟():创建一个递延对象,这个对象可以执行几个常用的方法,比如决心,拒绝,通知等;
所有():传入承诺的数组,批量执行,返回一个承诺对象,
当():传入一个不确定的参数,如果符合承诺标准,就返回一个承诺对象。
<强> 3.1。推迟()方法强>
在美元问服务中,用推迟()方法创建一个递延对象,然后这个对象可以调用解决方法定义成功状态,使用拒绝方法定义失败状态,并且可以在这些方法中传递参数,一般接口返回的数据都是用这些方法传递出去。最后通过延期对象.promise来返回一个承诺对象,来定义然后方法,然后方法中有三个参数,分别是成功回调,失败回调,状态变更回调。
<强>定义方法:强>
function funA (num) { 美元,var defer =, q.defer (); ,如果(num<5) { ,defer.resolve (& # 39; funA 成功# 39;); ,其他}{ ,defer.reject (& # 39; funA 错误# 39;); ,} ,return defer.promise; }
<>强方法调用(返回成功):强>
funA(3),然后(函数(成功){ ,console.log(成功); }、功能(err) { ,console.log(错); })
结果:
<强>方法调用(返回失败):强>
funA(8)(函数(成功){ ,console.log(成功); }、功能(err) { ,console.log(错); })
结果:
<强> 3.2。链式调用强>
了解了推迟()方法与然后()方法,接下来就能解决多个接口嵌套调用的问题了。
一般处理多个接口需要嵌套执行时,可采用角的链式调用,即:
FunA.then () () ();
在那方法中返回要调用的下一个接口。如下funA, funB,函数都是返回了承诺对象的方法,如果执行顺序为funA, funB,函数,则可用链式调用。
function funA (num) { 美元,var defer =, q.defer (); ,如果(num<5) { ,defer.resolve (& # 39; funA 成功# 39;); ,其他}{ ,defer.reject (& # 39; funA 错误# 39;); ,} ,return defer.promise; } , function funB (num) { 美元,var defer =, q.defer (); ,如果(num<5) { ,defer.resolve (& # 39; funB 成功# 39;); ,其他}{ ,defer.reject (& # 39; funB 错误# 39;); ,} ,return defer.promise; } , function funC (num) { 美元,var defer =, q.defer (); ,如果(num<5) { ,defer.resolve (& # 39; funC 成功# 39;); ,其他}{ ,defer.reject (& # 39; funC 错误# 39;); ,} ,return defer.promise; }使用角怎么实现异步变同步处理