【问题标题】:AngularJS promises don't execute in orderAngularJS 承诺不会按顺序执行
【发布时间】:2014-06-19 17:26:36
【问题描述】:

我无法理解某些承诺。它们在我的应用程序的某些实例中运行良好,但在某些情况下它们根本无法运行。

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

   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() 函数放在 return 前面,但这也不起作用。

我读到有时您必须将内容包装在 $scope.$apply 中,在这种情况下很可能是 $rootScope.$apply,因为它位于控制器范围之外的工厂中,但事实并非如此也真的要改变它,除此之外,我还没有真正掌握他们所描述的“Angular 之外”的东西。

我已经阅读了很多示例和教程,但我不再只见树木不见森林。

任何帮助将不胜感激。我很坚持这个:/谢谢

【问题讨论】:

  • myFactory.redrawTasks() -- 立即执行并将结果作为回调传递,而myFactory.redrawTasks 不调用该函数,而是将其引用作为回调传递。

标签: javascript angularjs promise


【解决方案1】:

.then 需要一个函数引用。

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

应该是

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

当您拥有() 时,该函数会立即执行,.then 会传递它返回的任何内容。

如 cmets 中所述,如果您在 redrawTasks 中依赖 this,您会这样做

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

【讨论】:

  • 天哪,我不敢相信它是如此简单,我从未见过。非常感谢非常快速简单的修复。节省了一天:)
  • 请注意,如果redrawTasks 使用this,这将失败
  • 好点。我想你可以通过.then(function() { myFactory.redrawTasks() }) 来解决这个问题?我从来没有遇到过在 JavaScript 中使用 this 的问题,所以我从来没有真正花费过任何卡路里来了解它是如何工作的。
  • 你在第一行的解决方案和你接下来的断言都是正确的——尤其是在人们不喜欢这个的浏览器 JavaScript 生态系统中。在 NodeJS 中它实际上很常见。
  • 谢谢,我会将其添加到答案中。
【解决方案2】:

试试:

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

您正在调用该函数。相反,您只想将它​​传递给 then 函数并让 Angular 调用它。

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多