2016-07-12 3 views
0

У меня есть несколько функций, объявленных, что каждый из них вызывает вызов API. Каждая функция точно такая же в функции, и я пытаюсь реорганизовать их все в 1 функцию, чтобы сделать код более эффективным. Для рефакторированной функции я передаю соответствующую информацию, например. URL API, массив для хранения возвращенных данных JSON и т. Д. Функция выполняет запрос $ http и возвращает JSON.Назначение значения переменной, переданной функции как параметр

Образец JSON находится ниже.

[{ 
    "options": [{ 
     "id": "1", 
     "desc": "JCB" 
    }, { 
     "id": "2", 
     "desc": "Tractor" 
    }, { 
     "id": "3", 
     "desc": "Truck" 
    }] 
}] 

Сначала я инициализирую массив для хранения возвращаемого API JSON и последующего вызова функции. Вызов инициализации и функции выглядит следующим образом:

$scope.valuesAPIData = []; // Array to store API JSON 
getAPIData("1234", "http://myAPI/getSomeValue.php?userid=", $scope.valuesAPIData, "options"); // Function call passing parameters 

Я создаю функцию, и мой response.data из запроса $ HTTP возвращает данные в формате JSON. Проверка apiArray показывает apiArray содержит JSON [объект Object].

1. Однако, мне нужно установить мой инициализируется массив $ scope.valuesAPIData к apiArray. Но как установить $ scope.valuesAPIData = apiArray, не записывая его, поскольку переданные параметры будут меняться при каждом вызове. $ scope.valuesAPIData не установлен (пустой) в предупреждении() ниже.

2. Кроме того, когда я пытаюсь и запросить внутренний цикл Foreach с value.apiValue - возвращает неопределенную. Когда я жестко кодирую это как value.options Я могу получить доступ к параметрам, но проблема в том, что имя «параметры» будет изменяться в каждом вызове API - например. его можно называть доступом в некоторых вызовах API.

function getAPIData(userID, apiURL, apiArray, apiValue) 
{ 
    $http.get(apiURL + userID).then(function success(response) 
    { 
     apiArray = response.data; // apiArray = [object Object] 
     alert("$scope.valuesAPIData: " + $scope.valuesAPIData); // Nothing here (blank) 

     angular.forEach(apiArray, function (value, key) 
     { 
      angular.forEach(value.apiValue, function (v, k) // value.apiValue gets missed completely 
      { 
       alert("API Response Data - id: " + v.id); 
       alert("API Response Data - desc: " + v.desc); 
      }); 
     }); 
    }, 
    function error(response) 
    { 
     var data = response.data; 
     alert("A error has occurred."); 
    });  
} 
+2

Это проект AngularJS, пожалуйста, добавьте angularjs в качестве тега. Рамки могут влиять на правильный ответ. –

ответ

0

Наилучший подход для этого типа функций Api Calls - дать возможность кому-либо вызвать функцию для обработки результата. И если вам нужно сделать синтаксический анализ, чтобы лучше было сделать это в функции api. Таким образом, вы будете иметь возможность вызвать функцию от различных сущностей (компоненты, контроллеры, другие услуги)

var apiFunction = (path,id) => { 
    return $http.get(path + id).then(result => result); 
} 

и вы называете его (скажем от контроллера)

и если вы хотите проанализировать данные, прежде чем возвращать их в функцию callee

var apiFunction = (path,id) =>{ 
    return $http.get(path+id).then(result => { 
     let parser = [] 
     result.data.forEach((item) =>{ 
      //assign whatever you want for example 
      if(item['options']) { 
      //stuff here     
      } 
      else if(item['somethingelse']){ 
      //stuff here 
      } 
     }) 
     //will return parser as result to the callee entity 
     return parser; 
    })  
} 
Смежные вопросы