在AngularJS中使用更改参数发送多个GET请求

时间:2017-01-23 15:45:19

标签: javascript angularjs

编辑:向回答者道歉,事实证明这实际上是有效的代码,但请求被截获并删除了所有参数。

我尝试向REST API发出重复的HTTP GET请求,具体取决于输出,并使用了this question中的解决方案。

但是,我希望增加我在请求中传递的一个参数。基本上,API会对输出进行分页,我需要相应地增加startAt的值。

手动请求可以正常使用:

<URL>/board?startAt=50

并回馈:

{"maxResults":50,"startAt":50,"isLast":true,"values":[list_of_values]}

到目前为止,这是我的代码:

function getHttpPromise(start_at) {
    // This function recurses until the server returns isLast = true.
    //
    // Each iteration appends the values in response.values to
    // $scope.boards.
    test = $http({
                    url: 'boards',
                    method: 'GET',
                    params: {'startAt': start_at.toString()}
                 }).
        success(function (response) {
            console.log(response); // the response contains startAt, which always has 
                                   // the initial value (0), rather than start_at's value

            var values = response.values;
            for (var i in values) {
                var board = values[i];
                $scope.boards[board.id] = board;
            }

            if (response.isLast) {
                // We have received all the boards.
                return true;
            } else {
                // Increment start_at and return another http request promise.
                start_at += response.maxResults;
                return getHttpPromise(start_at);
            }
        }
    );

    console.log(test); // params is correct here

    return test;
}

此功能由:

调用
jiraWorkLog.controller('SprintSelectCtlr',
function($scope, $http, $routeParams) {
    $scope.init = function() {
        $scope.boards = new Object();

        getHttpPromise(0).then(
            function (dummy_var) {
            for (var board in $scope.boards) {
                ...
            }
        }
    );
}
...
);

2 个答案:

答案 0 :(得分:0)

不推荐使用$http().success()。您应该使用$http().then()

then接收的函数将传递给具有response属性的data对象。在那里你会找到你的values

您可以进一步阅读here

在更彻底地阅读您的代码之后,我必须建议您不要递归地解决这个问题。如果您不希望分页数据,请提前发送所有记录的请求。

现在回答为什么你只得到第一个结果:这是因为这是唯一返回的东西和调用控制器。您正在返回控制器等待解决的承诺。所有其他递归调用仅在控制器完成后才会发生。

答案 1 :(得分:0)

响应包含所有http内容,并且您希望从中获取数据...

我认为以下链接可能对您有所帮助Angular Http

你的递归的另一个问题是你正在更新一个局部变量并错误地使用它...

function getHttpPromise(start_at) {
// This function recurses until the server returns isLast = true.
//
// Each iteration appends the values in response.values to
// $scope.boards.
test = $http({
                url: 'boards',
                method: 'GET',
                params: {'startAt': start_at.toString()}
             }).
    success(function (response) {
        console.log(response.data); // the response contains startAt, which always has 
                               // the initial value (0), rather than start_at's value

        var values = response.data;
        for (var i in values) {
            var board = values[i];
            $scope.boards[board.id] = board;
        }

        if (response.data.isLast) {
            // We have received all the boards.
            return true;
        } else {
            // Increment start_at and return another http request promise.
            return getHttpPromise(response.data.maxResults+1);
        }
    }
);

console.log(test); // params is correct here

return test;

}