Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Javascript AngularJS承诺don';不能按顺序执行_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript AngularJS承诺don';不能按顺序执行

Javascript AngularJS承诺don';不能按顺序执行,javascript,angularjs,promise,Javascript,Angularjs,Promise,我无法理解一些承诺。在我的应用程序的某些实例中,它们工作得很好,但在某些情况下,它们根本不工作 在控制器中,我有以下命令: myFactory.redrawCategories() .then(myFactory.redrawTasks()); 重画任务函数会立即调用,而无需等待重画类别完成 我工厂里的功能是这样的 redrawTasks: function(){ var defer = $q.defer(); db.getAllDo

我无法理解一些承诺。在我的应用程序的某些实例中,它们工作得很好,但在某些情况下,它们根本不工作

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

   myFactory.redrawCategories()
        .then(myFactory.redrawTasks());
重画任务函数会立即调用,而无需等待重画类别完成

我工厂里的功能是这样的

   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;

    },
一些unimortant代码已被删除,以便更好地进行概述

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

我读到过,有时你必须把东西包装在$scope中。$apply,在这种情况下很可能是$rootScope。$apply,因为它在工厂中,在控制器范围之外,但这也不会真正改变它,而且我还没有真正理解什么东西是他们描述的“角度之外”的

我读过很多例子和教程,但我再也看不到森林中的树木了

任何帮助都将不胜感激。我被这个难住了:/Thank

试试:

myFactory.redrawCategories()
    .then(myFactory.redrawTasks);
您正在调用函数。相反,您只需要将其传递给函数,然后让angular调用它。

尝试:

myFactory.redrawCategories()
    .then(myFactory.redrawTasks);
您正在调用函数。相反,您只需要将其传递给函数,然后让angular调用它。

尝试:

myFactory.redrawCategories()
    .then(myFactory.redrawTasks);
您正在调用函数。相反,您只需要将其传递给函数,然后让angular调用它。

尝试:

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

您正在调用函数。相反,您只需要将其传递给then函数并让angular调用它。

。然后,
需要函数引用

myFactory.redrawCategories()
    .then(myFactory.redrawTasks());
应该是

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

如评论中所述,如果您在
重画任务
中依赖
,您会这样做

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

。然后
需要函数引用

myFactory.redrawCategories()
    .then(myFactory.redrawTasks());
应该是

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

如评论中所述,如果您在
重画任务
中依赖
,您会这样做

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

。然后
需要函数引用

myFactory.redrawCategories()
    .then(myFactory.redrawTasks());
应该是

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

如评论中所述,如果您在
重画任务
中依赖
,您会这样做

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

。然后
需要函数引用

myFactory.redrawCategories()
    .then(myFactory.redrawTasks());
应该是

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

如评论中所述,如果您在
重画任务
中依赖
,您会这样做

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


myFactory.redrawTasks()
--立即执行并将结果作为回调传递,而
myFactory.redrawTasks
不调用函数,而是将其引用作为回调传递。
myFactory.redrawTasks()
--立即执行并将结果作为回调传递,而
myFactory.redrawTasks
不调用函数,而是将其引用作为回调传递。
myFactory.redrawTasks()
--立即执行并将结果作为回调传递,而
myFactory.redrawTasks
不调用函数,而是将其引用作为回调传递。
myFactory.redrawTasks()
--立即执行并将结果作为回调传递,而
myFactory.redrawTasks
不调用该函数,而是将其引用作为回调传递。天哪,我真不敢相信它这么简单,我从来没有看到过。非常感谢您快速简单的修复。保存日期:)请注意,如果
重画任务
使用
好点,则此操作将失败。我想您可以通过执行
来解决这个问题。然后(function(){myFactory.redrawTasks()})
?我从来没有遇到过javascript中的
这个
的问题,所以我从来没有真正花过任何精力去理解它是如何工作的。第一行中的解决方案和下面的断言都是正确的——特别是在浏览器javascript生态系统中,人们不喜欢这样。在NodeJS中,这其实很常见。谢谢,我会在答案中加上这一点。天哪,我真不敢相信它这么简单,我从来没见过。非常感谢您快速简单的修复。保存日期:)请注意,如果
重画任务
使用
好点,则此操作将失败。我想您可以通过执行
来解决这个问题。然后(function(){myFactory.redrawTasks()})
?我从来没有遇到过javascript中的
这个
的问题,所以我从来没有真正花过任何精力去理解它是如何工作的。第一行中的解决方案和下面的断言都是正确的——特别是在浏览器javascript生态系统中,人们不喜欢这样。在NodeJS中,这其实很常见。谢谢,我会在答案中加上这一点。天哪,我真不敢相信它这么简单,我从来没见过。非常感谢您快速简单的修复。保存日期:)请注意,如果
重画任务
使用
好点,则此操作将失败。我想您可以通过执行
来解决这个问题。然后(function(){myFactory.redrawTasks()})
?我从来没有遇到过javascript中的
这个
的问题,所以我从来没有真正花过任何精力去理解它是如何工作的。第一行中的解决方案和下面的断言都是正确的——特别是在浏览器javascript生态系统中,人们不喜欢这样。在NodeJS中,这其实很常见。谢谢,我会在答案中加上这一点。天哪,我真不敢相信它这么简单,我从来没见过。非常感谢您快速简单的修复。保存日期:)请注意,如果
重画任务
使用
好点,则此操作将失败。我想你可以通过做