浅谈Angular的$q, defer, promise
发布时间 - 2026-01-10 21:58:24 点击率:次1. $q

$q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常)。
2. defer
defer的字面意思是延迟,$q.defer() 可以创建一个deferred实例(延迟对象实例)。
deferred 实例旨在暴露派生的Promise 实例,以及被用来作为成功完成或未成功完成的信号API,以及当前任务的状态。这听起来好复杂的样子,总结$q, defer, promise三者之间的关系如下所示。
var deferred = $q.defer(); //通过$q服务注册一个延迟对象 deferred var promise = deferred.promise; //通过deferred延迟对象,可以得到一个承诺promise,而promise会返回当前任务的完成结果
defer的方法:
- deferred.resolve(value) 成功解决(resolve)了其派生的promise。参数value将来会被用作promise.then(successCallback(value){...}, errorCallback(reason){...}, notifyCallback(notify){...})中successCallback函数的参数。
- deferred.reject(reason) 未成功解决其派生的promise。参数reason被用来说明未成功的原因。此时deferred实例的promise对象将会捕获一个任务未成功执行的错误,promise.catch(errorCallback(reason){...})。补充一点,promise.catch(errorCallback)实际上就是promise.then(null, errorCallback)的简写。
- notify(value) 更新promise的执行状态(翻译的不好,原话是provides updates on the status of the promise's execution)
defer的小例子:
function asyncGreet(name) {
var deferred = $q.defer(); //通过$q.defer()创建一个deferred延迟对象,在创建一个deferred实例时,也会创建出来一个派生的promise对象,使用deferred.promise就可以检索到派生的promise。
deferred.notify('About to greet ' + name + '.'); //延迟对象的notify方法。
if (okToGreet(name)) {
deferred.resolve('Hello, ' + name + '!'); //任务被成功执行
} else {
deferred.reject('Greeting ' + name + ' is not allowed.'); //任务未被成功执行
}
return deferred.promise; //返回deferred实例的promise对象
}
function okToGreet(name) {
//只是mock数据,实际情况将根据相关业务实现代码
if(name == 'Superman') return true;
else return false;
}
var promise = asyncGreet('Superman'); //获得promise对象
//promise对象的then函数会获得当前任务也就是当前deferred延迟实例的执行状态。它的三个回调函数分别会在resolve(), reject() 和notify()时被执行
promise.then(function(greeting) {
alert('Success: ' + greeting);
}, function(reason) {
alert('Failed: ' + reason);
}, function(update) {
alert('Got notification: ' + update);
});
3. promise
当创建一个deferred实例时,promise实例也会被创建。通过deferred.promise就可以检索到deferred派生的promise。
promise的目的是允许interested parties 访问deferred任务完成的结果。
按照CommonJS的约定,promise是一个与对象交互的接口,表示一个动作(action)的结果是异步的,而且在任何给定的时间点上可能或不可能完成。(这句话好绕口,我的理解是promise相当于一个承诺,承诺你这个任务在给定的时间点上可能会完成,也可能完成不了。如果完成了那就相当于resolve, 如果未完成就相当于reject。不知道这样理解对不对?)
promise 的方法:
- then(successCallback, errorCallback, nitifyCallback) 根据promise被resolve/reject,或将要被resolve/reject,调用successCallback/errorCallback。
- catch(errorCallback) then(null, errorCallback)的缩写。
- finally(callback, notifyCallback)
补充说明:
promise.then()会返回一个新的衍生promise,形成promise链。例如:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# Angular
# $q
# defer
# promise
# AngularJS中update两次出现$promise属性无法识别的解决方法
# AngularJS中的Promise详细介绍及实例代码
# AngularJS 中的Promise --- $q服务详解
# 详解Javacript和AngularJS中的Promises
# AngularJS中处理多个promise的方式
# Angular中的Promise对象($q介绍)
# 浅析Angular2子模块以及异步加载
# 详解Angular.js的$q.defer()服务异步处理
# AngularJS出现$http异步后台无法获取请求参数问题的解决方法
# AngularJS 实现按需异步加载实例代码
# angularjs 处理多个异步请求方法汇总
# AngularJS中的promise用法分析
# 创建一个
# 也会
# 点上
# 就可以
# 是一个
# 那就
# 将会
# 会在
# 这句话
# 你这个
# 它可以
# 实际情况
# 所示
# 使你
# 可以得到
# 回调
# 未被
# 或不
# 或未
# 返回值
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何自定义建站之星模板颜色并下载新样式?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
如何获取免费开源的自助建站系统源码?
EditPlus中的正则表达式实战(5)
Laravel API资源类怎么用_Laravel API Resource数据转换
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
高防服务器如何保障网站安全无虞?
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
如何基于云服务器快速搭建个人网站?
网站建设要注意的标准 促进网站用户好感度!
Python文本处理实践_日志清洗解析【指导】
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
JavaScript如何实现路由_前端路由原理是什么
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何快速查询域名建站关键信息?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Swift开发中switch语句值绑定模式
音响网站制作视频教程,隆霸音响官方网站?
如何快速辨别茅台真假?关键步骤解析
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
如何快速搭建高效WAP手机网站吸引移动用户?
使用Dockerfile构建java web环境
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
如何快速配置高效服务器建站软件?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何制作一个表白网站视频,关于勇敢表白的小标题?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
JavaScript如何实现音频处理_Web Audio API如何工作?
香港服务器租用每月最低只需15元?
如何快速上传建站程序避免常见错误?
Laravel如何生成URL和重定向?(路由助手函数)
如何在IIS服务器上快速部署高效网站?
Linux系统命令中tree命令详解

