Angular使用Promise解决多个异步回调问题
来源:互联网 发布:java 判断是不是汉字 编辑:程序博客网 时间:2024/04/18 04:59
Promise的基本用法
var p1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, 'done'); })p1.then(data=>{ console.log(data); // done})//angular中的promise使用function pAjax(dataUrl,data) { var deferred = $q.defer(); // 声明延后执行,表示要去监控后面的执行 $http({ url:dataUrl, method: 'GET' // POST 需要传递data }).then(function (data, status, headers, config) { deferred.resolve(data); // 声明执行成功,即http请求数据成功,可以返回数据了 }, function (data, status, headers, config) { deferred.reject(data); // 声明执行失败,即服务器返回错误 }); return deferred;}
Promise一个明显的好处便是可以用来解决回调地狱。特别是在处理多个回调相互依赖的情况。
使用Promise解决多个异步依赖调用
Promise提供了一个方法Promise.all([p1,p2]),用于将多个Promise实例,包装成一个新的Promise实例。
接收的参数是一个数组,p1、p2都是Promise对象。
此时Promise.all的状态取决于它的参数。分两种情况:
p1、p2的状态都是resolve的时候,Promise.all的状态才会变成resolve;
只要p1、p2中有一个的状态为reject,那么Promise.all的状态就会变成reject;
所以我们可以用Promise.all()来解决多个异步依赖调用。
比如我们平常经常遇到的一种情况:
网站中需要先获取用户名,然后再根据用户名去获取用户信息。
这里获取用户名getUserName()和获取用户信息getUser()都是调用接口的异步请求。在获取用户信息之前,需要先获得用户名。
也就是说getUser依赖于getUserName的状态。所以我们可以将这两个请求通过Promise.all()封装成一个新的Promise对象。
function getUserPromise(promiseX, promiseY){ return Promise.all([promiseX, promiseY]) .then(values => // 返回的values由 promiseX 与 promiseY返回的值所构成的数组。 console.log(values); // [v1, v2] )}function getUserName(){ //let data = 'superman'; //return new Promise((resolve, reject) => { //setTimeout(resolve(data), 1000); // }) //} let dataUrl = '/sss/sss'; pAjax(dataUrl)}function getUser(){ let data = { id:1, username: 'superman', gender: 'male' } //return new Promise((resolve, reject) => { //setTimeout(resolve(data), 2000); // }) let dataUrl = '/sss/sss'; pAjax(dataUrl,data)}getUserPromise(getUserName(), getUser()).then(data => { // 这里的data就是包含了getUserName 和 getUser返回值所组成的数组 console.log(data); // [ 'superman', { id: 1, username: 'superman', gender: 'male' } ] })**使用Promise的链式调用**function getUserName(){ let data = 'superman'; return new Promise((resolve, reject) => { setTimeout(resolve(data), 4000); })}function getUser(username){ let data = { id:1, username: 'superman', gender: 'male' } return new Promise((resolve, reject) => { if(username){ setTimeout(resolve(data), 2000); } else{ reject('err'); } })}getUserName().then(username => { return getUser();}).then(user => { console.log(user);}).catch(err => { console.log(err);})
阅读全文
0 0
- Angular使用Promise解决多个异步回调问题
- 浅析 Angular $q promise 回调异步嵌套解决机制
- node中使用promise解决异步问题
- promise 解决异步问题
- 使用Promise异步发送多个fetch
- Promise解决AJAX异步问题
- Promise解决某个条件需要多个异步结果的问题
- ajax开发:Promise解决多个异步Ajax请求导致的代码嵌套问题
- angular 异步处理模式promise---$q
- 在Angular中使用promise
- 使用Promise解决多层异步调用的简单学习
- 使用ES6的Promise完美解决回调地狱
- 使用ES6的Promise完美解决回调地狱
- Promise解决回调函数的问题
- angular promise
- Javascript异步流程控制之Promise(1)-Angular $q简介
- angular定义promise异步处理值方式(超简单)
- js异步与解决Promise IE兼容问题
- centos7 安装 mysql
- 2017.9.4 Nim 思考记录
- docker 网络
- 【程序人生】让自己成为不可替代
- Python中heapq模块的用法
- Angular使用Promise解决多个异步回调问题
- 基于nginx和redis架构的高并发框架的设计与研究
- 【kubernetes/k8s源码分析】kube-controller-manager之endpoint controller源码分析
- 使用Retrofit请求API数据-codepath教程
- <jsp:include />与<%@ include %>自我总结
- TensorFlow如何通过tf.device函数来指定运行每一个操作的设备?
- node开发:windows环境下npm Cannot find module 'semver'
- Java程序调试的几种方法
- JavaSE (四)一般运算符解释和例子