AngularJS承诺不按顺序执行

时间:2014-06-19 07:23:05

标签: javascript angularjs promise

我无法理解一些承诺。它们在我的应用程序的某些实例中工作正常,但在某些情况下它们从不工作。

在我的控制器中,我有以下命令:

   myFactory.redrawCategories()
        .then(myFactory.redrawTasks());

立即调用redrawTasks函数,无需等待redrawCategories完成。

我工厂内的功能如下所示

   redrawTasks: function(){
        var defer = $q.defer();
        db.getAllDocs("task_").then(function(res) {

            angular.forEach(res, function(value){
               value = value.doc;
               tasks[value.category].push(value);
            });

            angular.forEach(tasks, function(taskArray, cat){
                // some code
            });

            defer.resolve(1);

        });

        return defer.promise;

    },

另一个就像

   redrawCategories: function(){

        var deferred = $q.defer();

        db.getAllDocs("category_").then(function(res) {

                var categoryArray = [];
                angular.forEach(res, function(value){
                    categoryArray.push(value.doc);
                });

                deferred.resolve("done");

        });


        return deferred.promise;

    },

为了更好的概述,删除了一些不重要的代码。

不知道该怎么做。我已经尝试将resolve()函数放在返回的前面,但这也不起作用。

我已经读过,有时候你必须在$ scope中包装。$ apply,在这种情况下很可能是$ rootScope。$在控制器范围之外的工厂中应用但是,这并没有真正改变它,除此之外我还没有真正掌握过什么东西在Angular"之外。正如他们所描述的那样。

我已经阅读了很多例子和教程,但我再也看不到树林了。

任何帮助都会受到很多赞赏。我很坚持这个:/谢谢

2 个答案:

答案 0 :(得分:2)

.then需要一个函数引用。

myFactory.redrawCategories()
    .then(myFactory.redrawTasks());

应该是

myFactory.redrawCategories()
    .then(myFactory.redrawTasks);

当你拥有()时,会立即执行该功能,并且无论它返回什么都会传递.then

如评论中所述,如果您依赖于this redrawTasks,那么

myFactory.redrawCategories()
    .then(function() { 
       return myFactory.redrawTasks();
    });

答案 1 :(得分:1)

尝试:

myFactory.redrawCategories()
    .then(myFactory.redrawTasks);

你正在调用这个函数。相反,你只想将它传递给函数并进行角度调用。