angularJS中的同步http调用
我有以下场景,我需要来自特定url的数据。我已经编写了一个函数,它接受参数“url”。在函数中,我有$http.get方法,它调用url。数据将返回给调用函数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;
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部分获取数据之前不返回。这个问题的解决方案是不同步代码。因此,我在回答时提到了“承诺”。