将值赋给传递给函数的变量作为参数

时间:2016-07-12 10:13:08

标签: javascript arrays angularjs json

我声明了几个函数,每个函数都进行一次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.");
    });      
}

1 个答案:

答案 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; 
    })      
}