我声明了几个函数,每个函数都进行一次API调用。每个函数在函数中完全相同,我试图将它们全部重构为1个函数,以使代码更加高效。对于重构函数,我传递相关信息,例如API URL,用于存储返回的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
我创建了该函数,$ http请求中的 response.data 返回JSON数据。检查 apiArray 会显示 apiArray 包含JSON [object Object] 。
1。但是,我需要将初始化的数组 $ scope.valuesAPIData 设置为 apiArray 。但是如何设置 $ scope.valuesAPIData = apiArray ,因为传递的参数会在每次调用时发生变化。 $ scope.valuesAPIData 在下面的alert()中设置为空(空白)。
2。此外,当我尝试使用 value.apiValue 查询内部forEach循环时 - 它返回 undefined 。当我将其硬编码为 value.options 时,我可以访问这些选项 - 但问题是“选项”的名称会在每个API调用中发生变化 - 例如在某些API调用中,它可能被称为 access 。
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.");
});
}
答案 0 :(得分:0)
这种类型的Api Calls函数的最佳方法是让谁调用函数来处理结果。如果你需要做一些解析,那么最好在api函数中做到这一点。 这样,您就可以从各种实体(组件,控制器,其他服务)调用该函数
var apiFunction = (path,id) => {
return $http.get(path + id).then(result => result);
}
你打电话给它(让你的控制器说)
someService.apiFunction('example','234').then(result => {
//do what ever logic you want for example
$scope.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;
})
}