在 AngularJS 中,$q 是用于实现 Promise(承诺)机制的核心服务,主要用于:

$http、$timeout、$resource 等服务提供统一的异步抽象$q 的设计思想来源于 Promises/A+ 规范,但在早期 AngularJS 版本中并非完全等同于 ES6 Promise,而是针对 Angular 框架特性进行了扩展。
一个 Promise 对象在生命周期中只可能处于以下三种状态之一:
| 状态 | 含义 |
|---|---|
pending | 初始状态,未完成、未拒绝 |
fulfilled(resolved) | 操作成功完成 |
rejected | 操作失败 |
⚠️ 状态一旦从 pending 变为 fulfilled 或 rejected,就不可再改变。
.then()、.catch() 等方式注册回调$q 统一调度,并自动触发 $digestvar deferred = $q.defer();
deferred 对象包含两个关键部分:
| 属性 | 说明 |
|---|---|
deferred.promise | Promise 对象,对外暴露 |
deferred.resolve(value) | 标记成功 |
deferred.reject(reason) | 标记失败 |
deferred.notify(value) | 进度通知(较少使用) |
function asyncTask() {
var deferred = $q.defer();
setTimeout(function () {
if (Math.random() > 0.5) {
deferred.resolve('成功结果');
} else {
deferred.reject('失败原因');
}
}, 1000);
return deferred.promise;
}
调用方:
asyncTask().then(
function (result) {
console.log(result);
},
function (error) {
console.error(error);
}
);
promise.then(onFulfilled, onRejected, onNotified);
onFulfilled(value):成功回调onRejected(reason):失败回调onNotified(value):进度回调(可选)promise
.then(function (data) {
return data + 1;
})
.then(function (data) {
return data * 2;
})
.then(function (finalResult) {
console.log(finalResult);
});
关键原则:
then的返回值会被自动包装为一个新的 Promise
resolverejectpromise.catch(function (reason) {
// 错误处理
});
等价于:
promise.then(null, function (reason) {});
asyncTask() .then(processData) .then(saveData) .catch(handleError);
? 符合“错误集中处理”的工程实践
asyncTask()
.then(successHandler)
.catch(errorHandler)
.finally(function () {
console.log('操作结束');
});
常用于:
将一个值或 Promise 转换为 $q Promise。
$q.when(10).then(function (value) {
console.log(value); // 10
});
常用于统一同步 / 异步接口返回值。
直接创建一个失败状态的 Promise。
return $q.reject('参数非法');
并行执行多个 Promise,全部成功才成功。
$q.all({
user: getUser(),
order: getOrder()
}).then(function (results) {
console.log(results.user);
console.log(results.order);
});
这是 $q 区别于原生 Promise 的核心优势。
$q.when(data).then(function () {
$scope.value = 123;
});
$scope.$apply()Promise.resolve().then(function () {
$scope.value = 123;
// 视图可能不会更新
});
app.service('UserService', function ($q, $http) {
this.getUser = function (id) {
var deferred = $q.defer();
$http.get('/user/' + id)
.then(function (res) {
deferred.resolve(res.data);
})
.catch(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
});
login() .then(loadProfile) .then(loadPermissions) .then(initApp) .catch(handleError);
❌ 不推荐:
return deferred;
✅ 推荐:
return deferred.promise;
如果已有 Promise,直接返回即可:
return $http.get('/api');
❌ 回调嵌套
✅ Promise 链
$q 是 AngularJS 异步编程的核心机制,其主要特点包括:
到此这篇关于AngularJS中$q 服务的用法的文章就介绍到这了,更多相关AngularJS $q 服务内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!