无法从 $http promise 和 then() 代码中获取值未执行
Can't get a value from $http promise and then() code not executed
我过去已经遇到过 $http
服务的问题,我通过创建一个服务来处理我的请求来解决这个问题(对于那些感兴趣的人,这里是 link 的答案,这对我有帮助我,编辑部分:).
现在的问题是这个解决方案似乎无法有效处理更大的 $http
请求。在上一个中,我只将请求返回的单词分配给了 $scope
值。现在,返回的是 JSON 格式的整个配置(我也想存储在 $scope
中)。
我理解承诺的概念,事实上 $http
返回的值在响应到来之前是一个空字符串,这可能需要一些时间。但是在这里,配置并没有那么长,而且我似乎从来没有得到答案;我在视图上显示接收值的变量,并且在调用函数时它不会改变。
代码如下:
查看
...
<div>
{{loadedConfig}}
</div>
<button ng-click="loadconfig()">load</button>
控制器
app.controller('ConfigurationCtrl', function ($scope, $rootScope, configloader) {
...
$scope.loadedConfig = 'noconfig'
$scope.loadconfig = function() {
configloader.load().then(function (response) {
$scope.loadedConfig = response.data;
});
};
工厂
angular
.module('app')
.factory('configloader', configloaderFactory);
function configloaderFactory($http) {
var service = {
load: load
}
return service;
function load() {
return $http.get('url/config');
}
}
如果我调用 'lesser weighted request',这没有问题。我还尝试了其他方法来进行此调用,但在每种情况下都不起作用...(使用 $q.deferred
、使用 success()/error() 或使用自定义 sleep()
函数)
then
中的代码是否应该在我收到响应时执行? (我假设是,但从来没有)。
谢谢
尝试:
angular
.module('app')
.factory('configloader', configloaderFactory);
function configloaderFactory($http) {
var service = {
load: load
}
return service;
function load() {
return $http.get('url/config')
.then(requestSuccessful)
.catch(requestFailed)
}
function requestSuccessful(response) {
return response.data;
}
function requestFailed(error) {
console.log('Fail', error.data)
}
}
由于这与长(更大)请求有关,请考虑更改您的代码并使用超时:
return $http({
method: 'GET',
url: 'url/config',
timeout: 1 * 60 * 1000 // timeout of 1 minute
});
试试 return 你工厂里的 promise
,比如 :
function load() {
var promise = $http.get('url/config').then(function(response){
return response.data;
}, function(err){
//error
return err;
});
return promise;
}
我过去已经遇到过 $http
服务的问题,我通过创建一个服务来处理我的请求来解决这个问题(对于那些感兴趣的人,这里是 link 的答案,这对我有帮助我,编辑部分:
现在的问题是这个解决方案似乎无法有效处理更大的 $http
请求。在上一个中,我只将请求返回的单词分配给了 $scope
值。现在,返回的是 JSON 格式的整个配置(我也想存储在 $scope
中)。
我理解承诺的概念,事实上 $http
返回的值在响应到来之前是一个空字符串,这可能需要一些时间。但是在这里,配置并没有那么长,而且我似乎从来没有得到答案;我在视图上显示接收值的变量,并且在调用函数时它不会改变。
代码如下:
查看
...
<div>
{{loadedConfig}}
</div>
<button ng-click="loadconfig()">load</button>
控制器
app.controller('ConfigurationCtrl', function ($scope, $rootScope, configloader) {
...
$scope.loadedConfig = 'noconfig'
$scope.loadconfig = function() {
configloader.load().then(function (response) {
$scope.loadedConfig = response.data;
});
};
工厂
angular
.module('app')
.factory('configloader', configloaderFactory);
function configloaderFactory($http) {
var service = {
load: load
}
return service;
function load() {
return $http.get('url/config');
}
}
如果我调用 'lesser weighted request',这没有问题。我还尝试了其他方法来进行此调用,但在每种情况下都不起作用...(使用 $q.deferred
、使用 success()/error() 或使用自定义 sleep()
函数)
then
中的代码是否应该在我收到响应时执行? (我假设是,但从来没有)。
谢谢
尝试:
angular
.module('app')
.factory('configloader', configloaderFactory);
function configloaderFactory($http) {
var service = {
load: load
}
return service;
function load() {
return $http.get('url/config')
.then(requestSuccessful)
.catch(requestFailed)
}
function requestSuccessful(response) {
return response.data;
}
function requestFailed(error) {
console.log('Fail', error.data)
}
}
由于这与长(更大)请求有关,请考虑更改您的代码并使用超时:
return $http({
method: 'GET',
url: 'url/config',
timeout: 1 * 60 * 1000 // timeout of 1 minute
});
试试 return 你工厂里的 promise
,比如 :
function load() {
var promise = $http.get('url/config').then(function(response){
return response.data;
}, function(err){
//error
return err;
});
return promise;
}