[英]AngularJS: simultaneous $http get returns wrong data in $.each loop
我正在嘗試檢索多個ID的數據,如下所示:
(已大大簡化,但我希望我能闡明我的觀點)
控制器:
var idList = [39,40,41];
$.each(idList, function(key, value){
var dataObject = {
type: "test",
id: value
};
var getData = DataFactory.get(dataObject);
getData.then(function(result){
console.log(result);
}
});
廠:
app.factory("DataFactory", ['$http', '$rootScope',
function($http, $rootScope){
url = 'http://url/api';
var obj = {};
obj.get = function(object){
return $http({
method: 'GET',
params: object,
url: url
})
.then(function(results){
return results.data;
});
};
return obj;
}
]);
后端:
<?php
$id = $_GET['id'];
$type = $_GET['type'];
echo json_encode(array("id": $id, "type": type, "value": "value matching id ".$id));
?>
如果idList為1整數,則返回的數據與id匹配,例如:
{id: 39, type: "test", value: "value matching id 39"}
但是,在idList中應用多個值時,返回的數據不會應用於正確的id:
{id: 39: type: "test", value: "value matching id 41"}
{id: 40: type: "test", value: "value matching id 39"}
{id: 41: type: "test", value: "value matching id 40"}
我希望如果我發回相同的ID,則與該ID匹配的值將是正確的。 不是這種情況。 有什么方法可以將ID正確綁定到正確的匹配值?
編輯:查看Chrome中的網絡標簽,會發生以下情況:
對於1個ID
url: api?id=39&type=test
result(preview): data: [id: 39, type: test, value: 'value matching id 39']
對於3個ID
url: api?id=39&type=test (same for 40 and 41)
result(preview): data: [id: 39, type: test, value: 'value matching id 40']
幾乎看起來php沒有正確處理請求。 打開api網址( http:// url / api?id = 39&type = test )總是可以得到預期的結果。 從javascript多次調用api會給我帶來混亂的結果。
它看起來很正確,也許是PHP無法識別“ GET”操作。
您是否嘗試將console.log放入工廠,以查看是否使用了正確的URL? (並且很高興看到網絡)。
而且,您也可以采用“錯誤的方式”(只是為了進行測試),將網址進行硬編碼,如下所示:
url: url + "?id=" + object.id + "&type=" + object.type
如果在使用帶有jersey的spring配置時在Java中遇到此問題,則該問題可能是由標有@component的資源的單例性質引起的。 當新請求到達時,將同一個bean與舊的注入值一起用於查詢,標頭參數和其他業務對象。 這意味着它將使用舊值獲取數據。
解決該問題的一種方法是在資源類上使用原型作用域,以在每次有以下請求時使用新注入獲取新實例: @Scope("prototype")
或修改get方法簽名,以便其需要的所有值例如參數是在方法處注入的,而不是注入到對象中的。
第二個選項更好,因為實例將被重用,並且每個方法調用僅更改參數。
代替這個
@QueryParam("searchTerm")
private String searchTerm;
@GET
private Product findProduct() {
productDao.find(searchTerm);
}
做這個
@GET
private Product getProduct(@QueryParam("searchTerm") String searchTerm) {
productDao.find(searchTerm);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.