浅谈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命令详解