`
youyu4
  • 浏览: 440513 次
社区版块
存档分类
最新评论

AngularJS -- Promise对象($q介绍)

 
阅读更多
这篇文章主要介绍了Angular中的Promise对象($q介绍),本文讲解了Promise模式、Q Promise的基本用法、AngularJs中的$q.defferd等内容,需要的朋友可以参考下
 

在用JQuery的时候就知道 promise 是 Js异步编程模式的一种模式,但是不是很明白他跟JQuery的deferred对象有什么区别。随着公司项目的进行,要跟后台接数据了,所以决定搞定它。

Promise

Promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件。

我们知道,在编写javascript异步代码时,callback是最最简单的机制,可是用这种机制的话必须牺牲控制流、异常处理和函数语义化为代价,甚至会让我们掉进出现callback大坑,而promise解决了这个问题。

ES6中Promise、angularJS内置的AngularJS内置Q,以及when采用的都是Promises/A规范,如下:

每个任务都有三种状态:未完成(pending)、完成(fulfilled)、失败(rejected)。

1.pending状态:可以过渡到履行或拒绝状态。
2.fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。
3.rejected状态:不能变为其他任何状态,而且状态不能改变,必须有reason。

状态的转移是一次性的,状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),就不能再变了。

 

复制代码代码如下:

function okToGreet(name){
    return name === 'Robin Hood';
}
 
function asyncGreet(name) {
    var deferred = $q.defer();
 
    setTimeout(function() {
     // 因为这个异步函数fn在未来的异步执行,我们把代码包装到 $apply 调用中,一边正确的观察到 model 的改变
        $scope.$apply(function() {
            deferred.notify('About to greet ' + name + '.');
 
            if (okToGreet(name)) {
                deferred.resolve('Hello, ' + name + '!');
            } else {
                deferred.reject('Greeting ' + name + ' is not allowed.');
            }
        });
    }, 1000);
 
    return deferred.promise;
}
 
var promise = asyncGreet('Robin Hood');
promise.then(function(greeting) {
    alert('Success: ' + greeting);
}, function(reason) {
    alert('Failed: ' + reason);
}, function(update) {
    alert('Got notification: ' + update);
});

 

Q Promise的基本用法

上面代码表示, $q.defer() 构建的 deffered 实例的几个方法的作用。如果异步操作成功,则用resolve方法将Promise对象的状态变为“成功”(即从pending变为resolved);如果异步操作失败,则用reject方法将状态变为“失败”(即从pending变为rejected)。最后返回 deferred.promise ,我们就可以链式调用then方法。

JS将要有原生Promise,ES6中已经有Promise对象,firefox和Chrome 32 beta版本已经实现了基本的Promise API

AngularJs中的$q.defferd

通过 调用 $q.defferd 返回deffered对象以链式调用。该对象将Promises/A规范中的三个任务状态通过API关联。

deffered API

deffered 对象的方法

1.resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。
2.reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。
3.notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。

deffered 对象属性

promise :最后返回的是一个新的deferred对象 promise 属性,而不是原来的deferred对象。这个新的Promise对象只能观察原来Promise对象的状态,而无法修改deferred对象的内在状态可以防止任务状态被外部修改。

Promise API

当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise 得到该引用。

promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

promise 对象的方法

1.then(errorHandler, fulfilledHandler, progressHandler):then方法用来监听一个Promise的不同状态。errorHandler监听failed状态,fulfilledHandler监听fulfilled状态,progressHandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。
2.catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式
3.finally(callback) ——让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。 更多的信息请参阅 完整文档规范.

通过then()方法可以实现promise链式调用。

 

复制代码代码如下:

promiseB = promiseA.then(function(result) {  
  return result + 1;  
});  
 
// promiseB 将会在处理完 promiseA 之后立刻被处理,  
// 并且其  value值是promiseA的结果增加1

 

$q的其他方法

$q.when(value):传递变量值,promise.then()执行成功回调
$q.all(promises):多个promise必须执行成功,才能执行成功回调,传递值为数组或哈希值,数组中每个值为与Index对应的promise对象

分享到:
评论

相关推荐

    AngularJS 中的Promise --- $q服务详解

    2. `all()`:这个方法接受一个Promise对象的数组,当所有数组中的Promise都变为fulfilled状态时,`all`返回的Promise才会被fulfilled,如果有任何一个Promise被rejected,那么整个`all`返回的Promise也会被rejected...

    解决Angularjs异步操作后台请求用$q.all排列先后顺序问题

    $q是AngularJS中用于处理promise对象的模块,而promise是一种用于处理异步编程的方式。在AngularJS中,开发者经常需要处理与服务器端的异步通信,比如HTTP请求。这些请求往往需要按特定顺序执行,以确保数据的正确性...

    angularjs-routing-源码.rar

    2. **`$q`服务**:`resolve`中的函数通常返回一个`Promise`,利用`$q`服务来处理异步操作。 六、总结 理解AngularJS的路由机制,不仅有助于我们编写高效、灵活的应用,还能在遇到问题时迅速定位原因。通过对`$...

    AngularJS-1.3

    AngularJS 1.3 对 Promise 进行了改进,使其更符合 Promises/A+ 规范,提高了异步编程的便利性。 10. **性能提升**: 1.3 版本通过优化脏检查 (`$digest`) 循环,降低了内存占用,并提高了整体性能。`$$watchers`...

    AngularJS中update两次出现$promise属性无法识别的解决方法

    4. **适当地处理Promise**:在AngularJS中,正确地处理Promise对象,避免在未完成的Promise上进行操作。使用`.then`或`.catch`来处理Promise的结果,而不是直接访问其属性。 **四、最佳实践** 1. **API设计**:...

    Angular中的Promise对象($q介绍)

    在Angular开发中,Promise对象是处理异步操作的关键工具,特别是在使用AngularJS 1.x版本时,$q服务被广泛用于构建复杂的异步流程。Promise模式允许开发者以一种线性、可读性强的方式处理异步操作,从而避免了回调...

    AngularJS中的promise用法分析.docx

    在AngularJS的`$q`服务中,可以通过`$q.defer()`创建一个新的Promise对象,然后通过`deferred.resolve()`或`deferred.reject()`来改变Promise的状态。在上述代码中,`send`函数中的`deferred.reject('resolve')`会将...

    angularjs-tdd-open-assignment-solution

    6. **服务**:用于封装应用的业务逻辑和数据,如$http服务用于HTTP请求,$q服务用于异步操作的承诺(Promise)。 7. **测试**:使用Karma设置测试环境,编写Jasmine测试用例,涵盖控制器、服务、指令等组件的测试。...

    AngularJS-Weather-App:在 David Souther 的帮助下开发的 AngularJS 天气 APP

    - **$q** 服务:处理异步操作,支持 Promise API。 4. **API 调用** - **天气 API**:该应用可能使用了 OpenWeatherMap 或其他天气 API 来获取实时天气信息。 - **JSON 格式**:API 返回的数据通常为 JSON 格式...

    angularjs-slides:AngularJS 幻灯片

    6. **服务**:AngularJS 提供了多种内置服务,如 `$http`(HTTP 客户端)、`$q`(Promise 对象)和 `$timeout`(延迟执行)。幻灯片会介绍如何创建自定义服务和使用服务工厂。 7. **测试**:AngularJS 鼓励单元测试...

    详解Javacript和AngularJS中的Promises

    $q.all接受一个Promise对象的数组,当所有Promise对象成功完成时,返回的Promise对象才会成功完成;如果有任何一个Promise对象失败,则$q.all返回的Promise对象就会失败。 例如: ```javascript $q.all([promise1,...

    form-validation-angularjs-example:如何使用 AngularJS 进行表单验证

    异步验证通常涉及发送HTTP请求,返回的是Promise对象。 ```javascript ngModelCtrl.$asyncValidators.uniqueEmail = function(modelValue, viewValue) { var promise = $http.get('/check-email', { params: { ...

    AngularJS中的promise用法分析

    在实际开发中,$q服务提供了多种方法来管理promise对象,包括$q.all()、$q.when()等,它们提供了不同的方式来处理多个promise对象,以及将值转换成promise对象。这些方法在处理多个异步操作时尤其有用,可以大幅度...

    angularjs-guide:AngularJS Guide 中文版

    AngularJS 通过服务提供共享功能,例如 $http 服务用于发起HTTP请求,$rootScope 为全局作用域,$q 用于异步操作的承诺(Promise)管理。服务是单例的,可以在整个应用的生命周期内被多个组件共享。 **六、过滤器**...

    AngularJS中的Promise详细介绍及实例代码

    在ES6中,Promise已经成为内置对象,提供了与AngularJS中的$Q类似的功能。不过,AngularJS中的$Q服务遵循Promises/A规范,而原生的Promise遵循Promises/A+规范,两者在一些细节上有所不同,但基本用法是相似的。 总...

    angularjs-codeschool:在跟进 codeschool angularjs 课程时编写的代码

    服务是AngularJS中可复用的单例对象,常用于存储数据和实现业务逻辑。常见的服务有$http用于发送HTTP请求,$scope用于模型与视图之间的数据绑定,$q用于异步操作的承诺(Promise)管理等。开发者也可以自定义服务以...

    angularjs-studies

    4. **服务(Services)**:AngularJS 中的服务是一种可复用的组件,如 `$resource` 服务用于与 RESTful API 交互,`$q` 用于异步编程的承诺(Promise)。 5. **模块(Modules)**:AngularJS 应用通常由一个或多个...

    AngularJS封装UEditor

    - 使用AngularJS的`$q`服务进行Promise操作,确保异步操作完成后才执行后续步骤。 9. **兼容性与性能优化**: - 考虑到不同浏览器的兼容性和性能问题,需要确保封装的UEditor能在主流浏览器上正常工作,并优化...

    AngularJS中处理多个promise的方式

    这个函数接收一个Promise对象的数组作为参数,当数组中所有的Promise都被解析(即`resolve`)时,`$q.all()`返回的Promise才会被解析,从而执行与之关联的回调函数。例如在提供的代码示例中: ```javascript var ...

Global site tag (gtag.js) - Google Analytics