AngularJS 中承诺的顺序和时间

Order and timing for promises in AngularJS

我不明白 AngularJS 中承诺的概念。我有两个功能:一个是获取远程设置配置,另一个是获取这个远程配置(存储在 $scope 中)。我需要将它们分开,因为我在应用程序的其他部分使用不同的超时或调用。

我以为有了 promises 一切都是 运行 一个接一个,在这里我发现我的 fetch 函数在 loading 函数之前开始。为什么?为什么系统正在等待下载我的设置,然后开始抓取?

    /* ----- $scope.sea.funcs.seaInit(); ----- */
    $scope.sea.funcs.seaInit = function() {
        // PROMISES ORDER
        var deferred = $q.defer();
        var promise = deferred.promise;
        // 0 : get distant config
        promise.then(function() {
            /* ----- SERVICE ConfigService.generale(); ----- */
            ConfigService.generale({call: 'yes'}, function(responseSC) {
                // store datas
                $scope.datas.shared.configuration = responseSC[0];
                console.log('load end');
            });
        });
        // 1 : fetch stored distant config
        promise.then(function() {
            $scope.sea.funcs.seaConfigFetch();
        });
        // final resolve
        deferred.resolve('ok');
    }

    /* ----- $scope.sea.funcs.seaConfigFetch(); ----- */
    $scope.sea.funcs.seaConfigFetch = function() {
            console.log('fetch start');
            // here i do operations with $scope ...
   }

    /* ----- $scope.sea.funcs.seaInit(); call ----- */
    $timeout($scope.sea.funcs.seaInit, 3000);

这里,'fetch start'出现在'load end'之前。我把服务直接放在第一个承诺中,因为我认为这是问题所在,但不是。

我有 $scope 个值的错误 'not defined'。

根据您上面的内容,您定义了 1 个承诺并附加了两个在解决时调用的函数,我想您想要的是在 ConfigServices.generale 完成后调用 seaConfigFetch .为此,您可以更新为以下内容:

/* ----- $scope.sea.funcs.seaInit(); ----- */
$scope.sea.funcs.seaInit = function() {

    // PROMISES ORDER
    var deferred = $q.defer();
    var promise = deferred.promise;
    // 0 : get distant config
    /* ----- SERVICE ConfigService.generale(); ----- */
    ConfigService.generale({call: 'yes'}, function(responseSC) {
        // store datas
        $scope.datas.shared.configuration = responseSC[0];
        console.log('load end');
        // final resolve
        deferred.resolve('ok');
    });
    // 1 : fetch stored distant config
    promise.then(function() {
        $scope.sea.funcs.seaConfigFetch();
    });
}

如果 ConfigService.generale 正在返回一个承诺,您可以进一步简化它以删除您创建的 $q.defer() 。或者完全删除承诺并在 deferred.resolve 处调用 seaConfigFetch。这是一篇关于带有承诺的常见反模式的好文章:http://taoofcode.net/promise-anti-patterns/