簡體   English   中英

AngularJS:同時$ http get在$ .each循環中返回錯誤的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM