AngularJS中承诺的顺序和时间安排

时间:2015-02-15 15:41:16

标签: javascript angularjs angular-promise

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

我认为承诺一切都是一个接一个地运行,在这里我发现我的函数获取在加载函数之前开始。为什么?为什么系统等待下载我的设置,然后启动提取?

    /* ----- $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值的错误“未定义”。

1 个答案:

答案 0 :(得分:1)

根据上面的内容,你定义了1个promise并附加了两个函数,当它被解析时,我想你想要的是在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返回一个promise,你可以更简化它以删除你创建的$ q.defer()。或者完全删除承诺并在deferred.resolve中调用seaConfigFetch。这是一篇关于共同反模式与承诺的好文章:http://taoofcode.net/promise-anti-patterns/