Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS承诺在完成时不会调用'then'回调_Angularjs_Promise_Q - Fatal编程技术网

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'
      });
  });
});