国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Angular中的Promise對象($q介紹)

2024-05-06 16:15:48
字體:
來源:轉載
供稿:網(wǎng)友
這篇文章主要介紹了Angular中的Promise對象($q介紹),本文講解了Promise模式、Q Promise的基本用法、AngularJs中的$q.defferd等內(nèi)容,需要的朋友可以參考下
 

在用JQuery的時候就知道 promise 是 Js異步編程模式的一種模式,但是不是很明白他跟JQuery的deferred對象有什么區(qū)別。隨著公司項目的進行,要跟后臺接數(shù)據(jù)了,所以決定搞定它。

Promise

Promise是一種模式,以同步操作的流程形式來操作異步事件,避免了層層嵌套,可以鏈式操作異步事件。

我們知道,在編寫javascript異步代碼時,callback是最最簡單的機制,可是用這種機制的話必須犧牲控制流、異常處理和函數(shù)語義化為代價,甚至會讓我們掉進出現(xiàn)callback大坑,而promise解決了這個問題。

ES6中Promise、angularJS內(nèi)置的AngularJS內(nèi)置Q,以及when采用的都是Promises/A規(guī)范,如下:

每個任務都有三種狀態(tài):未完成(pending)、完成(fulfilled)、失敗(rejected)。

1.pending狀態(tài):可以過渡到履行或拒絕狀態(tài)。
2.fulfilled狀態(tài):不能變?yōu)槠渌魏螤顟B(tài),而且狀態(tài)不能改變,必須有value值。
3.rejected狀態(tài):不能變?yōu)槠渌魏螤顟B(tài),而且狀態(tài)不能改變,必須有reason。

狀態(tài)的轉移是一次性的,狀態(tài)一旦變成fulfilled(已完成)或者failed(失敗/拒絕),就不能再變了。

 

復制代碼代碼如下:

function okToGreet(name){
    return name === 'Robin Hood';
}
 
function asyncGreet(name) {
    var deferred = $q.defer();
 
    setTimeout(function() {
     // 因為這個異步函數(shù)fn在未來的異步執(zhí)行,我們把代碼包裝到 $apply 調(diào)用中,一邊正確的觀察到 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對象的狀態(tài)變?yōu)?ldquo;成功”(即從pending變?yōu)閞esolved);如果異步操作失敗,則用reject方法將狀態(tài)變?yōu)?ldquo;失敗”(即從pending變?yōu)閞ejected)。最后返回 deferred.promise ,我們就可以鏈式調(diào)用then方法。

JS將要有原生Promise,ES6中已經(jīng)有Promise對象,firefox和Chrome 32 beta版本已經(jīng)實現(xiàn)了基本的Promise API

AngularJs中的$q.defferd

通過 調(diào)用 $q.defferd 返回deffered對象以鏈式調(diào)用。該對象將Promises/A規(guī)范中的三個任務狀態(tài)通過API關聯(lián)。

deffered API

deffered 對象的方法

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

deffered 對象屬性

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

Promise API

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

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

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 被拒絕還是解決。 更多的信息請參閱 完整文檔規(guī)范.

通過then()方法可以實現(xiàn)promise鏈式調(diào)用。

 

復制代碼代碼如下:

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

 

$q的其他方法

$q.when(value):傳遞變量值,promise.then()執(zhí)行成功回調(diào)
$q.all(promises):多個promise必須執(zhí)行成功,才能執(zhí)行成功回調(diào),傳遞值為數(shù)組或哈希值,數(shù)組中每個值為與Index對應的promise對象


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 泸定县| 杂多县| 金坛市| 黑河市| 长宁县| 芮城县| 福海县| 彭泽县| 宁城县| 二连浩特市| 滁州市| 蓬安县| 高尔夫| 淳化县| 温州市| 兰州市| 庆云县| 平阴县| 亚东县| 麻栗坡县| 五华县| 保康县| 滕州市| 乌苏市| 若羌县| 汤阴县| 永仁县| 资阳市| 广州市| 绥德县| 石泉县| 稻城县| 武穴市| 石嘴山市| 浦北县| 潞西市| 赤壁市| 额尔古纳市| 汉源县| 淮阳县| 威海市|