我有以下情况,我需要来自特定网址的数据。我写了一个带参数' 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中提取数据之前,如何强制函数不返回?
答案 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
});