我是angularjs
的新手。我看到$q
在安靜的API調用中檢查承諾。 $q.defer()
被用來保留承諾對象。 我讀到了有關承諾,但我沒有得到任何東西。 雖然我可以在沒有$q
的情況下進行api調用,但是它在文章中的某處使用。
所以我想知道$q
的確切用法以及在不使用$q
的情況下進行api調用的區別。
請幫忙。 謝謝
我是angularjs
的新手。我看到$q
在安靜的API調用中檢查承諾。 $q.defer()
被用來保留承諾對象。 我讀到了有關承諾,但我沒有得到任何東西。 雖然我可以在沒有$q
的情況下進行api調用,但是它在文章中的某處使用。
所以我想知道$q
的確切用法以及在不使用$q
的情況下進行api調用的區別。
請幫忙。 謝謝
我認爲我寫的關於$ 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一起工作。
我喜歡這個問題。因爲,我也面對這個。
這是一項服務,可幫助您異步運行函數,並在完成處理時使用它們的返回值。
例子:
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;
});
};
});
感謝您編寫@Veera ...我只是想知道,而不使用'$ q'service意味着我們正在同步調用API ..對嗎? –
請參考此同步和異步調用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
安置自己的代碼,而不是屏幕截圖。 – Mistalis
@Mistalis刪除了圖片 –
感謝@sachilaranawaka的寫作......請問,我應該在哪裏使用angularjs中的'$ q'?我怎樣才能真正使用'$ q'中的承諾? –