使用角怎么实现异步变同步处理

  介绍

今天就跟大家聊聊有关使用角怎么实现异步变同步处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强> 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;   }

使用角怎么实现异步变同步处理