zoukankan      html  css  js  c++  java
  • amgular $q用法

    amgular $q用法

     

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

    Promise

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

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

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

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

    • pending状态:可以过渡到履行或拒绝状态。
    • fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。
    • 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 对象的方法

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

    deffered 对象属性

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

    Promise API

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

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

    promise 对象的方法

    • then(errorHandler, fulfilledHandler, progressHandler):then方法用来监听一个Promise的不同状态。errorHandler监听failed状态,fulfilledHandler监听fulfilled状态,progressHandler监听unfulfilled(未完成)状态。此外,notify 回调可能被调用 0到多次,提供一个进度指示在解决或拒绝(resolve和rejected)之前。
    • catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式
    • 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对象。

    转贴:http://www.html5jscss.com/angular-promise.html

  • 相关阅读:
    [Linux]Vmwaer创建CENTOS7虚拟机[转]
    [游记]二访金陵
    [Android]ADB调试: SecurityException: Injecting to another application requires INJECT_EVENTS permission
    [操作系统]记一次未尽的三星 Galaxy A6s(SM-G6200)刷机过程
    [网络]NAT与内网穿透技术初探【待续】
    结构化系统建模之程序流程图|系统流程图|数据流图
    UML系统建模之用例视图
    [Linux]常用命令之【mkdir/touch/cp/rm/ls/mv】
    [Linux]监控外部用户登录及外部主机连接情况
    [Java SE]Unicode解码
  • 原文地址:https://www.cnblogs.com/hualuna87/p/6060084.html
Copyright © 2011-2022 走看看