Angular $q 完全指南
转自: 如果想使用 $http 或者其他异步操作,那 $q 是必须要掌握的概念啦. Let’s get started! 如何理解$q,deferred object ? 形象的讲解angular中的$q与promise 假设有一个家具厂,而它有一个VIP客户张先生。 如何创建 promise -1 $q 支持两种写法,第一种是类似于ES6标准构造函数写法 $q(function resolver (resolve,reject) {}) 注意: + ES6 写法并不支持 progress/notify 的回调函数 + 在构造函数中抛异常也并不会显式的reject the promise // var iWantResolve = false; var iWantResolve = true; function es6promise() { return $q(function (resolve,reject) { $timeout(function () { if (iWantResolve) { resolve("es6promise resolved"); } else { reject("es6promise reject"); } },1000) }) } promise 的方法 promise.then(successCb,errCb,notifyCb) 其中successCb 将在 promise resolve 后被调用,errCb 将在 promise reject 后被调 notifyCb 将在 deferred.notify 后被调用,可以多次调用 promise.catch == promise.then(null,errCb),用于处理之前没有被处理的 rejected promise promise.finally 将最后被调用,一般用于资源释放的清理操作 es6promise() .then(function (data) { console.log(data); }) .catch(function (err) { console.log(err); }); // if(iWantResolve == true) output: es6promise resolved // if(iWantResolve = false) output: es6promise reject 如何创建 promise -2 第二种是类似于 commonJS 的写法 $q.deferred() function commonJsPromise() { var deferred = $q.defer(); $timeout(function () { deferred.notify("commonJS notify"); if (iWantResolve) { deferred.resolve("commonJS resolved"); } else { deferred.reject("commonJS reject"); } },500); return deferred.promise; } commonJsPromise() .then(function /** success callback**/(data) { console.log(data); },function /** error callback **/ (err) { console.log(err); },function /** progress callback **/ (update) { console.log(update); }); // if(iWantResolve == true) output: commonJS notify commonJS resolved // if(iWantResolve = false) output: commonJS notify commonJS reject $q.all $q.all([promise1,promise1]) 接受一个包含若干个 promise 的数组,等所有的 promise resolve 后,其本身 resolve 包含上述结果的数组 [data1,data2] 如果上述 promise 有一个 reject,那么$q.all() 会把这个 rejected promise 作为其 rejected promise (只有一个哦) progress/notify 的 callback 并没有用 $q.all([es6promise(),commonJsPromise()]) .then(function (dataArr) { console.log("$q.all: ",dataArr); },function (err) { console.log("$q.all: ",err) },function /** unnecessary **/ (update) { console.log("$q.all",update); }); // if(iWantResolve == true) output: $q.all: ["es6promise resolved","commonJS resolved"] // if(iWantResolve = false) output: $q.all: es6promise reject $q.reject,$q.when,$q.resolve $q.reject() 立即返回一个rejected 的 promise,在链式调用的时候很有用 $q.resolve == $q.when(value,successCb,errorCb,progressCb) value 可能是一个 then-able 的 obj(即可以是 $q.defer() 返回的,也可以是其他库产生的),也可能是任意数据,但是 $q.when 最终都会返回一个 promise $q.when 既可以写成上述的构造函数形式,也可以写成 $q.when(value).then(fn,fn,fn) 的形式 $q.reject("instant reject") .catch(function (err) { console.log(err); }); // output: instant reject $q.when(commonJsPromise(),function /** success callback **/(data) { console.log("$q.when success callback function: " + data); return "$q.when success callback return another value"; }) .then(function (data) { console.log("$q.when then function:" + data); }); // if(iWantResolve == true) output: // $q.when success callback functionL: commonJS resolved // $q.when then function:$q.when success callback return another value // if(iWantResolve = false) output: // $q.when err callback function: commonJS reject // $q.when then function:undefined $q.when("some value",function (data){ console.log(data); }) // output: some value promise chains 链式调用 任何在 successCb,errCb 中返回的非 $q.reject()对象,都将成为一个 resolve 的 promise. $q.when("1") .then(function (data) { console.log(data); return $q.reject(2); }) .catch(function (err) { console.log(err); return 3; }) .then(function (data) { console.log(data); }) // output: 1 2 3 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |