angularJS中的同步http调用

时间:2015-07-20 05:39:00

标签: angularjs http http-get

我有以下情况,我需要来自特定网址的数据。我写了一个带参数' url'的函数。在函数内部,我有$ http.get方法,它调用url。数据将返回到调用函数

var getData = function (url) {
    var data = "";

    $http.get(url)
        .success( function(response, status, headers, config) {
             data = response;
        })
        .error(function(errResp) {
             console.log("error fetching url");
        });
    return data;
}

问题如下,$ http.get是异步的,在获取响应之前,函数返回。因此,调用函数将数据作为空字符串获取。在从URL中提取数据之前,如何强制函数不返回?

4 个答案:

答案 0 :(得分:20)

看看承诺来克服这些问题,因为它们在角落世界中被广泛使用。

您需要使用$q

var getData = function (url) {
    var data = "";
    var deferred = $q.defer();

    $http.get(url)
        .success( function(response, status, headers, config) {
             deferred.resolve(response);
        })
        .error(function(errResp) {
             deferred.reject({ message: "Really bad" });
        });
    return deferred.promise;
}

这是关于promises and $q

的好文章

<强>更新

仅供参考, $http服务本身会返回一个承诺,因此在此方案中不一定需要$q(因此anti-pattern)。

但是不要让这成为跳过阅读有关$ q和承诺的理由。

所以上面的代码等同于:

var getData = function (url) {
    var data = "";
    return $http.get(url);
}

答案 1 :(得分:9)

您也可以使用$ q.all()方法解决此问题

var requestPromise = [];

var getData = function (url) {
    var data = "";

    var httpPromise = $http.get(url)
        .success( function(response, status, headers, config) {
             data = response;
        })
        .error(function(errResp) {
             console.log("error fetching url");
        });

    requestPromise.push(httpPromise);
}

在调用函数

$q.all(requestPromise).then(function(data) {

    //this is entered only after http.get is successful
});

确保将$ q作为依赖项注入。希望它有所帮助

答案 2 :(得分:5)

执行所需操作的典型方法是:

var getData = function(url, callback) {
    $http.get(url).success(function(response) {
        callback && callback(response);
    });
};

用过:

getData('/endpoint', function(data) {
    console.log(data);
});

答案 3 :(得分:5)

你的功能似乎多余。只需使用$http.get(url),因为无论如何您还没有做任何其他事情。

var url = 'foo/bar';

$http
    .get(url)
    .success( function(response, status, headers, config) {
        $scope.data = response;
    })
    .error(function(errResp) {
        console.log("error fetching url");
    });

或者如果您以后需要访问承诺,只需将其分配给变量;

var promise = $http.get(url);

// some other code..

promise.then(function(data){
   //.. do something with data
});