2017-04-19 57 views
-1

我是angularjs的新手。我看到$q在安靜的API調用中檢查承諾。 $q.defer()被用來保留承諾對象。 我讀到了有關承諾,但我沒有得到任何東西。 雖然我可以在沒有$q的情況下進行api調用,但是它在文章中的某處使用。

所以我想知道$q的確切用法以及在不使用$q的情況下進行api調用的區別。

請幫忙。 謝謝

回答

10

我認爲我寫的關於$ q的文章可能會幫助你。

介紹$ Q

$ q是角定義一個服務。它和新的Promise()相同。但$ q通過增強開發人員可以用來更簡單地執行復雜任務的附加功能,將事物提升到了一個新的水平。

這是使用$ Q

angular.module("app",[]) 
.controller("ctrl",function($scope,$q){ 
    var work = "resolve"; 
    var promise = $q(function(resolve, reject) { 
    if (work === "resolve") { 
     resolve('response 1!'); 
    } else { 
     reject('Oops... something went wrong'); 
    } 
    }); 
    promise.then(function(data) { 
    alert(data) 

    }) 
}) 

$ q.defer()

$ q.defer()返回的承諾構造的實例創建承諾的樣本。創建延遲對象後,您可以從該對象訪問以下方法和屬性

resolve(value) - 使用該值解析派生承諾。如果該值是通過$ q.reject構造的拒絕,則承諾將被拒絕。

reject(reason) - 拒絕派生承諾的理由。這相當於用通過$ q.reject構造的拒絕來解決它。

notify(value) - 提供承諾執行狀態的更新。在承諾被解決或被拒絕之前,這可能被多次調用。

promise - {}承諾 - 與此遞延

相關承諾對象見的例子

angular.module("app",[]) 
.controller("ctrl",function($scope,$q){ 
    var work = "resolve"; 

    function getData(){ 
    var obj = $q.defer(); 

    if (work === "resolve") { 
     obj.resolve('response 1!'); 
    } else { 
     obj.reject('Oops... something went wrong'); 
    } 

    return obj.promise; 
    } 
    getData().then(function(data) { 
    alert(data) 

    }) 
})  

$ q.all()

如果用戶需要發送多個請求一個鏡頭,那麼用戶可以使用$ q.all()服務。

$q.all([$http.get('data1.json'),$http.get('data2.json')]) 
     .then(function(response){ 
     console.log(response[0].data) // data1.json response 
     console.log(response[1].data) // data1.json response 
}) 

在這裏,有兩個http請求同時發送到兩個單獨的json文件來獲取數據。響應以數組形式出現,響應順序與http請求順序相同。

$ q.race()

$ q.race()非常相似,$ q.all()。但不是發送每個請求的響應,它只會返回一個請求響應。具體而言,只返回已執行的第一個請求的響應。這並不意味着它不會發送其他請求。所有的請求都在發送,但它只返回執行的第一個請求的響應。

$q.race([$http.get('data1.json'),$http.get('data2.json')]) 
     .then(function(response){ 
     console.log(response[0].data) // return one response 
}) 

在這裏,響應可以是data1.Json或data2.json。這是使用這種方法的失敗。自從它返回第一個被執行的請求的響應後,不能確定哪個請求響應將由該承諾解決。這種方法你不希望看到所有的請求

結論

使用$ Q從非承諾對象/回調建設承諾的反應,並利用$ Q批量請求非常有用。 all()和$ q.race()與現有的promise一起工作。

+1

安置自己的代碼,而不是屏幕截圖。 – Mistalis

+1

@Mistalis刪除了圖片 –

+0

感謝@sachilaranawaka的寫作......請問,我應該在哪裏使用angularjs中的'$ q'?我怎樣才能真正使用'$ q'中的承諾? –

3

我喜歡這個問題。因爲,我也面對這個。

這是一項服務,可幫助您異步運行函數,並在完成處理時使用它們的返回值。

Brief Description

Refer example

Promise with $q

例子:

app.service("githubService", function($http, $q) { 

    var deferred = $q.defer(); 

    this.getAccount = function() { 
     return $http.get('https://api.github.com/users/haroldrv') 
      .then(function(response) { 
       // promise is fulfilled 
       deferred.resolve(response.data); 
       // promise is returned 
       return deferred.promise; 
      }, function(response) { 
       // the following line rejects the promise 
       deferred.reject(response); 
       // promise is returned 
       return deferred.promise; 
      }); 
    }; 
}); 
+0

感謝您編寫@Veera ...我只是想知道,而不使用'$ q'service意味着我們正在同步調用API ..對嗎? –

+0

請參考此同步和異步調用http://stackoverflow.com/questions/5187968/how-should-i-call-3-functions-in-order-to-execute-them-one-after-the-other – 2017-04-19 13:09:45

相關問題