欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Angularjs Promise實例詳解

 更新時間:2018年03月15日 14:29:38   作者:柴小智  
Promise是一個構(gòu)造函數(shù),自己身上有all、reject、resolve這幾個異步方式處理值的方法,原型上有then、catch等同樣很眼熟的方法,下面通過實例代碼給大家講解angularjs promise 的相關(guān)知識,感興趣的朋友一起看看吧

一、什么是Promise

Promise是對象,代表了一個函數(shù)最終可能的返回值或拋出的異常,就是用來異步處理值的。

Promise是一個構(gòu)造函數(shù),自己身上有all、reject、resolve這幾個異步方式處理值的方法,原型上有then、catch等同樣很眼熟的方法。

二、為什么使用Promise

有了Promise對象,就可以把異步操作以同步操作的流程表達出來,避免了層層嵌套的回調(diào)函數(shù)。此外,Promise對象提供了統(tǒng)一的接口,使得控制異步操作更加容易。

Promise對象有以下2個特點:

1.對象的狀態(tài)不受外界影響。

Promise對象代表一個異步操作,有三種狀態(tài):Pending(進行中)、Resolved(已完成)和Rejected(已失敗)。只有異步操作的結(jié)果,可以決定當前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。

2.一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結(jié)果。

Promise對象的狀態(tài)改變,只有兩種可能:從Pending變?yōu)镽esolved;從Pending變?yōu)镽ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果。

三、如何創(chuàng)建一個Promise

先貼一段代碼:

define([
  'angularModule'
],function (app) {
  app.register.service('httpRequestService', ['$http', '$q', function ($http, $q) {
    return{
      request: function (params) {
        var deferred = $q.defer();
        $http({
          method : params.method,
          url : params.url
        }).success(
          function (data) {
            deferred.resolve(data);
          }
        ).error(
          function(data){
            deferred.reject(data);
          }
        );
        return deferred.promise;
      }
    }
  }])
});

 講一下$q服務

q服務是AngularJS中自己封裝實現(xiàn)的一種Promise實現(xiàn)。

要創(chuàng)建一個deferred對象,可以調(diào)用defer()方法:

var deferred = $q.defer(); 
//deffered上面暴露了三個方法,以及一個可以用于處理promise的promise屬性。 
//promise屬性里面又包含了then、catch、finally三個方法

在Promise中,定義了三種狀態(tài):等待狀態(tài),完成狀態(tài),拒絕狀態(tài)。

deffered API

1.deffered 對象的方法

1.resolve(value):在聲明resolve()處,表明promise對象由pending狀態(tài)轉(zhuǎn)變?yōu)閞esolve。
2.reject(reason):在聲明resolve()處,表明promise對象由pending狀態(tài)轉(zhuǎn)變?yōu)閞ejected。
3.notify(value) :在聲明notify()處,表明promise對象unfulfilled狀態(tài),在resolve或reject之前可以被多次調(diào)用。

2.deffered 對象屬性

promise :最后返回的是一個新的deferred對象 promise 屬性,而不是原來的deferred對象。這個新的Promise對象只能觀察原來Promise對象的狀態(tài),而無法修改deferred對象的內(nèi)在狀態(tài)可以防止任務狀態(tài)被外部修改。

3.Promise API

當創(chuàng)建 deferred 實例時會創(chuàng)建一個新的 promise 對象,并可以通過 deferred.promise 得到該引用。

promise 對象的目的是在 deferred 任務完成時,允許感興趣的部分取得其執(zhí)行結(jié)果。

4.promise 對象的方法

1.then(errorHandler, fulfilledHandler, progressHandler):then方法用來監(jiān)聽一個Promise的不同狀態(tài)。errorHandler監(jiān)聽failed狀態(tài),fulfilledHandler監(jiān)聽fulfilled狀態(tài),progressHandler監(jiān)聽unfulfilled(未完成)狀態(tài)。此外,notify 回調(diào)可能被調(diào)用 0到多次,提供一個進度指示在解決或拒絕(resolve和rejected)之前。

2.catch(errorCallback) —— promise.then(null, errorCallback) 的快捷方式

3.finally(callback) ——讓你可以觀察到一個 promise 是被執(zhí)行還是被拒絕, 但這樣做不用修改最后的 value值。 這可以用來做一些釋放資源或者清理無用對象的工作,不管promise 被拒絕還是解決。

q常用的幾個方法:

  • defer() 創(chuàng)建一個deferred對象,這個對象可以執(zhí)行幾個常用的方法,比如resolve,reject,notify等
  • all() 傳入Promise的數(shù)組,批量執(zhí)行,返回一個promise對象
  • when() 傳入一個不確定的參數(shù),如果符合Promise標準,就返回一個promise對象。

all()方法

當批量的執(zhí)行某些方法時,就可以使用這個方法。有了all,你就可以并行執(zhí)行多個異步操作,并且在一個回調(diào)中處理所有的返回數(shù)據(jù)。

用Promise.all來執(zhí)行,all接收一個數(shù)組參數(shù),里面的值最終都算返回Promise對象。這樣,三個異步操作的并行執(zhí)行的,等到它們都執(zhí)行完后才會進到then里面。

那么,三個異步操作返回的數(shù)據(jù)哪里去了呢?都在then里面呢,all會把所有異步操作的結(jié)果放進一個數(shù)組中傳給then,就是 下面的results。所以下面代碼的輸出結(jié)果就是:     

  var funcA = function(){
        console.log("funcA");
        return "hello,funA";
      }
      var funcB = function(){
        console.log("funcB");
        return "hello,funB";
      }
      $q.all([funcA(),funcB()])
      .then(function(result){
        console.log(result);
      });

執(zhí)行的結(jié)果:

funcA
funcB
Array [ "hello,funA", "hello,funB" ] 

when()方法

when方法中可以傳入一個參數(shù),這個參數(shù)可能是一個值,可能是一個符合promise標準的外部對象。

      var funcA = function(){
        console.log("funcA");
        return "hello,funA";
      }
      $q.when(funcA())
      .then(function(result){
        console.log(result);
      });

當傳入的參數(shù)不確定時,可以使用這個方法。

hello,funA

四、鏈式請求

通過then()方法可以實現(xiàn)promise鏈式調(diào)用,因為then方法總是返回一個新的promise。

runAsync1()
.then(function(data){
  console.log(data);
  return runAsync2();
})
.then(function(data){
  console.log(data);
  return runAsync3();
})
.then(function(data){
  console.log(data);
});
function runAsync1(){
  var p = new Promise(function(resolve, reject){
    //做一些異步操作
    setTimeout(function(){
      console.log('異步任務1執(zhí)行完成');
      resolve('隨便什么數(shù)據(jù)1');
    }, 1000);
  });
  return p;      
}
function runAsync2(){
  var p = new Promise(function(resolve, reject){
    //做一些異步操作
    setTimeout(function(){
      console.log('異步任務2執(zhí)行完成');
      resolve('隨便什么數(shù)據(jù)2');
    }, 2000);
  });
  return p;      
}
function runAsync3(){
  var p = new Promise(function(resolve, reject){
    //做一些異步操作
    setTimeout(function(){
      console.log('異步任務3執(zhí)行完成');
      resolve('隨便什么數(shù)據(jù)3');
    }, 2000);
  });
  return p;      
}

運行結(jié)果:

總結(jié)

以上所述是小編給大家介紹的Angularjs Promise實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • AngularJS中的表單簡單入門

    AngularJS中的表單簡單入門

    本文主要介紹AngularJS 表單,這里對AngularJS 表單知識做了詳細整理介紹,希望能幫助有需要的小伙伴
    2016-07-07
  • AngularJS 遇到的小坑與技巧小結(jié)

    AngularJS 遇到的小坑與技巧小結(jié)

    本文主要對AngularJS 遇到的小坑與技巧進行了一個小小的總結(jié),比較使用,希望能給大家做一個參考。
    2016-06-06
  • Angularjs在360兼容模式下取數(shù)據(jù)緩存問題的解決辦法

    Angularjs在360兼容模式下取數(shù)據(jù)緩存問題的解決辦法

    這篇文章主要為大家詳細介紹了Angularjs在360兼容模式下取數(shù)據(jù)緩存問題的解決辦法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Facade Service暴露commands簡化代碼邏輯提高可訪問性組合性

    Facade Service暴露commands簡化代碼邏輯提高可訪問性組合性

    在 Angular 應用開發(fā)中,使用 Facade Service 暴露 commands(命令)以及訂閱這些 commands 是一個常見的設計模式,本文將詳細介紹在 Facade Service 中如何實現(xiàn)這一目標,并深入探討相關(guān)細節(jié),以及通過實際示例進行說明
    2023-10-10
  • 收藏AngularJS中最重要的核心功能

    收藏AngularJS中最重要的核心功能

    本文是小編日常收集整理的關(guān)于:AngularJS中最重要的核心功能,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-07-07
  • angular4中引入echarts的方法示例

    angular4中引入echarts的方法示例

    這篇文章主要介紹了angular4中引入echarts的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 盤點分析Angular框架那些著名的安全漏洞

    盤點分析Angular框架那些著名的安全漏洞

    這篇文章主要為大家介紹了盤點分析Angular框架那些著名的安全漏洞,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • angular.js實現(xiàn)列表orderby排序的方法

    angular.js實現(xiàn)列表orderby排序的方法

    今天小編就為大家分享一篇angular.js實現(xiàn)列表orderby排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 詳解AngularJs中$sce與$sceDelegate上下文轉(zhuǎn)義服務

    詳解AngularJs中$sce與$sceDelegate上下文轉(zhuǎn)義服務

    這篇文章給大家詳細介紹了AngularJs提供的嚴格上下文轉(zhuǎn)義服務$sce與$sceDelegate,文中介紹的很詳細,有需要的朋友們可以參考借鑒。
    2016-09-09
  • AngularJS HTML編譯器介紹

    AngularJS HTML編譯器介紹

    這篇文章主要介紹了AngularJS HTML編譯器介紹,AngularJS的HTML編譯器能讓瀏覽器識別新的HTML語法。它能讓你將行為關(guān)聯(lián)到HTML元素或者屬性上,甚至能讓你創(chuàng)造具有自定義行為的新元素,需要的朋友可以參考下
    2014-12-12

最新評論