AngularJS承诺在完成时不会调用'then'回调
我有一个像主控制器的东西,它在作用域中设置了一些东西,所以内部控制器可以使用它 安装工作是异步的,因此我将其包装在一个承诺中,但除非已经解决,否则它不会执行回调(我尝试设置断点,如果我等待的时间足够长,它实际上会运行AngularJS承诺在完成时不会调用'then'回调,angularjs,promise,q,Angularjs,Promise,Q,我有一个像主控制器的东西,它在作用域中设置了一些东西,所以内部控制器可以使用它 安装工作是异步的,因此我将其包装在一个承诺中,但除非已经解决,否则它不会执行回调(我尝试设置断点,如果我等待的时间足够长,它实际上会运行然后回调) 这里有一把小提琴,它通过超时而不是网络请求再现了我的问题: HTML 它显示“超时”,但不显示“然后…”消息 (我知道这更适合服务,但我已经有很多嵌套作用域的代码,我想在开始重构之前让它工作起来)如果您使用的是$.getJSON()(我猜是来自jQuery) 您将遇到一个
然后回调)
这里有一把小提琴,它通过超时而不是网络请求再现了我的问题:
HTML
它显示“超时”,但不显示“然后…”消息
(我知道这更适合服务,但我已经有很多嵌套作用域的代码,我想在开始重构之前让它工作起来)如果您使用的是$.getJSON()
(我猜是来自jQuery)
您将遇到一个类似的问题,您正在解决角度世界之外的问题,请尝试以下方法
$.getJSON('ajax/test.json', function(data) {
$scope.$apply(function(){
deferred.resolve({
'foo' : 'baz'
});
});
});
这使得示例能够工作,但还不能解决我的问题:/I我不能用$timeout
替换setTimeout
,因为我真正的代码正在执行json请求。而我已经在使用$apply
,问题是已完成的回调没有被调用:(呸!我错过了网络请求部分,所以我假设您正在使用$http
?是的,否则我甚至不会为超时而烦恼:Pavesome,它现在起作用了!:D我认为承诺解决/然后将无缝工作,而无需包装成$apply
…谢谢!!您使用$http
?
function configController ($scope, $q) {
var deferred = $q.defer();
$scope.config = deferred.promise;
setTimeout(function() {
console.log('timeout');
deferred.resolve({
'foo' : 'baz'
});
}, 1000);
};
function testC($scope) {
$scope.test = 'I am working, uh?';
$scope.config.then(function(config) {
console.log('then...');
$scope.$apply(function() {
$scope.foo = config.foo;
});
});
};
$.getJSON('ajax/test.json', function(data) {
$scope.$apply(function(){
deferred.resolve({
'foo' : 'baz'
});
});
});