angularJS中的同步http调用

angularJS中的同步http调用,angularjs,http,http-get,Angularjs,Http,Http Get,我有以下场景,我需要来自特定url的数据。我已经编写了一个函数,它接受参数“url”。在函数中,我有$http.get方法,它调用url。数据将返回给调用函数 var getData = function (url) { var data = ""; $http.get(url) .success( function(response, status, headers, config) { data = response;

我有以下场景,我需要来自特定url的数据。我已经编写了一个函数,它接受参数“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;
}
$q.all(requestPromise).then(function(data) {

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

问题如下:$http.get是异步的,在获取响应之前,函数返回。因此,调用函数以空字符串的形式获取数据。如何强制函数在从url获取数据之前不返回?

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

var getData = function(url, callback) {
    $http.get(url).success(function(response) {
        callback && callback(response);
    });
};
用法如下:

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

看看承诺来克服这些问题,因为它们在世界各地都被使用

你需要使用

这里有一篇关于这个问题的好文章

更新:

仅供参考,
$http
服务本身会返回一个承诺,因此在这个场景中不一定需要
$q
(因此是一个承诺)

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

因此,上述代码相当于以下代码:

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

你的功能似乎是多余的。只需使用
$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
});
您也可以使用$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);
}
在调用函数中

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;
}
$q.all(requestPromise).then(function(data) {

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

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

您可以返回成功和错误函数本身,以便进一步使用…我如何访问承诺的价值?这是常见的反模式请参见:是的,我知道。但是我试着让OP的事情变得简单。如果一个人不知道第一手承诺是什么,那么像“$http本身返回一个承诺”这样的语句可能会让任何人感到困惑。为什么这个答案被标记为正确?这个解决方案不会使http请求同步,它仍然是异步的。@CarlosCalla:我有没有提到在我的解决方案中的任何地方这是一种“同步”技术?您可能只是阅读了问题标题,但没有看到OP的实际需求。如果你没注意到,这是他问题的要点。OP实际上是从函数返回一些东西,其值实际上是推断的“async”。请参见如何强制函数在从url部分获取数据之前不返回。这个问题的解决方案是不同步代码。因此,我在回答时提到了“承诺”。