angularJS - 如何逐个执行查询?

时间:2016-04-08 11:41:41

标签: angularjs asynchronous

我有一些对象,想要执行一些请求 - 每个对象一个。

如何实现它,因为$ http-service在异步模式下执行请求?

与C#中的async / await类似

2 个答案:

答案 0 :(得分:1)

您可以在$ http的回调中调用下一个请求。 像这样:

function sendRequestList(objectList) {

    if (objectList.length > 0) {
        var currentObject = objectList.pop();

        $http.get(/* request params here */)
        .then(
            function() {
                sendRequestList(objectList);
            },
            function() {
                sendRequestList(objectList);
            }
        );
    }
}

但是,我不知道如何以您想要的方式实现这一目标。 希望这有帮助。

A +

答案 1 :(得分:1)

如果您希望在继续之前完成所有请求,则可以使用angular的$q服务生成承诺,并仅在每个请求完成时返回结果。

// all of this in a controller injecting $q

function fetchAll(objects) {
    var deferred = $q.defer();
    var done = 0;
    var results = {};
    for(var i=0; i < objects.length - 1; i++) {

        // a trick to avoid every iteration to share same i value
        (function(index) {
            $http.get(/* request params here */)
            .then(
                function(data) {
                    results[index] = data;
                    // or results[object.anyProperty] = data;
                    done++;
                    // ensure all calls are successful
                    if (done === objects.length) {
                        deferred.resolve();
                    }
                },
                function() {
                    deferred.reject();
                }
            );
        })(i);

    }

    return deferred.promise;
}

// and call it like this

fetchAll(objects)
.then(function success(result) {
    // continue your business
}, function error(result) {
    // handle error
});