我有以下情况,我需要特定网址的数据。我写了一个函数,它接受参数’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获取数据之前,如何强制函数不返回?
看看承诺克服这些问题,因为它们被用在整个地方,在有角度的世界。
你需要使用$q
var getData = function (url) { var data = ""; var deferred = $q.defer(); $http.get(url) .success( function(response,config) { deferred.resolve(response); }) .error(function(errResp) { deferred.reject({ message: "Really bad" }); }); return deferred.promise; }
这是promises and $q的一篇很好的文章
更新:
FYI,$ http服务本身返回一个承诺,所以$ q在这种情况下并不是必需的(因此也就是anti-pattern)。
但不要让这是跳过阅读关于$ q和承诺的原因。
var getData = function (url) { var data = ""; return $http.get(url); }