关于angular $q 和 promise
ES6中的promise
白话: 处理异步回调的一个构造函数, 解决了以前的不停的嵌套callback的方式
1:
function run1() { var p= new Promise(function (resolve,reject) { setTimeout(function () { console.log("no1"); // 异步操作成功后的处理函数 resolve("promise1"); // 异步操作失败后的处理函数 reject("error1") },2000) }); return p } run1().then(function (data) { console.log(data); }).
结果:no1 prosemise1
2: 链式操作的不停回调。
function run1() { var p= new Promise(function (resolve,reject) { setTimeout(function () { console.log("no1"); // 异步操作成功后的处理函数 resolve("promise1"); // 异步操作失败后的处理函数 reject("error1") },2000) }); return p } function run2() { var p= new Promise(function (resolve,reject) { setTimeout(function () { console.log("no2"); resolve("promise2") },2000) }); return p } function run3() { var p= new Promise(function (resolve,reject) { setTimeout(function () { console.log("no3"); resolve("promise3") },2000) }); return p } run1().then(function (data) { console.log(data); return run2(); }).then(function (data) { console.log(data) return run3(); }).then(function (data) { console.log(data) });
结果:
no1
promise1
no2
promise2
no3
promise3
3: resolve reject
run1().then(function (data) { // 指定promise异步处理成功后的函数 console.log(data) }).catch(function (data) { // 指定promise异步处理失败后的函数 console.log(data) });
我们知道Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?其实它和then的第二个参数一样,用来指定reject的回调
还有一个作用就是
执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。
4: promise.all()
// Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。 Promise.all([run1(),run2(),run3()]).then(function (result) { console.log(result); }); // 有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据