Javascript Angular服务从本地文件获取JSON无效
我尝试创建一个从本地JSON文件获取数据的服务,但它不起作用,也没有解释为什么不起作用 这个。以下是我的服务代码:Javascript Angular服务从本地文件获取JSON无效,javascript,json,angularjs,Javascript,Json,Angularjs,我尝试创建一个从本地JSON文件获取数据的服务,但它不起作用,也没有解释为什么不起作用 这个。以下是我的服务代码: webTestApp.factory('webtest', function($q, $timeout, $http) { var Webtest = { fetch: function(callback) { var ret = function() { $http.get('webtest.json
webTestApp.factory('webtest', function($q, $timeout, $http) {
var Webtest = {
fetch: function(callback) {
var ret = function() {
$http.get('webtest.json').success(function(data) {
return data;
});
};
return ret();
}
};
return Webtest;
});
上面的Plunkr正是我在我的项目中所做的,但我在有人得到同样的东西的地方分叉。
我在这里找到的
这是一个工作版本
webTestApp.factory('webtest', function($q, $timeout, $http) {
var Webtest = {
fetch: function(callback) {
var deferred = $q.defer();
$timeout(function() {
$http.get('webtest.json').success(function(data) {
deferred.resolve(data);
});
}, 30);
return deferred.promise;
}
};
return Webtest;
});
我的问题是,为什么我的版本(第一个块)不起作用,而第二个块起作用?您使用
ret
函数将其过度复杂化。下面是您的代码的简化版本,其中我只返回$http call返回的承诺:
要使您的版本正常工作,您的ret
函数需要返回一些内容($http是一个异步调用,所以它的成功与否并不重要,实际上回调会返回一些内容):
然后,解析$http承诺时,实际的数据内容在response.data
中,而不仅仅是response
(完整的response
实际上包含头和其他与服务器调用相关的信息)。以下是您的原始版本和这两个修复程序:
您编写的第二个示例之所以有效,是因为它返回了一个简单的$q承诺(这就是为什么
$scope.data
有效,而$scope.data.data
不需要),但它代表了一个,所以您应该坚持原来的方法(或者使用我在第一段中给您的简化版本).因为您没有从函数返回承诺:返回$http.get…
嗯?因此,如果我在$http.get…
之前添加return
,它应该可以工作吗?我试过了,但还是不起作用。正如我所说,有两件事需要解决:返回
,和响应.data
(在您的例子中,$scope.data.data
)。很明显,它在我的plunker中起作用:。$http调用返回的承诺与$q承诺略有不同返回一个响应对象,并附加一个数据对象?当然。它只是一个回调函数,您可以从服务中忽略它<代码>然后()在控制器中调用就足够了。如果您想在返回数据之前修改数据或其他内容,可以在服务中使用success
(或then
)。在这里查看服务,这就是您所需要的:因为它将返回未定义的。请记住,当我们第一次调用$http函数时,它会立即返回承诺(远远早于它实际到达所需的文件)!因此,promise.data将是未定义的,而scope变量将保持不变,而如果我们返回promise本身,那么一旦promise被解析或拒绝,scope变量将得到更新。
var ret = function() {
return $http.get('webtest.json').success(function(data) {
// this ^^ is the key
return data;
});
};