为啥,如果 `$q.all` 没有返回一个 promise 数组,那么不会抛出异常?

Posted

技术标签:

【中文标题】为啥,如果 `$q.all` 没有返回一个 promise 数组,那么不会抛出异常?【英文标题】:Why, if `$q.all` is not returned an array of promises, is an exception not thrown?为什么,如果 `$q.all` 没有返回一个 promise 数组,那么不会抛出异常? 【发布时间】:2016-03-06 23:47:51 【问题描述】:

除此之外,为什么在 $q.all 被称为完全忽略之前设置 $scope 值?

主控制器内的功能:

$scope.apply = function (security) 

    var entity = shareDataService.getModalEntity();
    var depot = shareDataService.getModalDepot();
    $scope.loaded = false;
    var myDataPromise;

    if (entity == "NULL") 
        myDataPromise = getDataService.getDataFromREST(security);
     else 
        myDataPromise = $q.all(getDataService.keepICorrect(security));
    ;
    myDataPromise.then(function () 


                 //DO STUFF


, function errorCallback(response) 

                    //DO MORE STUFF

    );

我的服务中的keepICorrect() 函数(这是一个闭包):

 keepICorrect: function (security) 

        var promises = [];
            for (var i = 0 ; i < entity.length; i++) 
                promises.push(this.getDataFromREST(security, i));
            
         return promises;
    ,

但是,当$scope.apply() 函数被执行时,什么也没有发生。布尔值$scope.loaded 不会在作用域上激活,也不会引发异常(这是我所期待的)。这是为什么呢?

我已经编辑了代码并让我的控制器函数Apply检查entity = "NULL",这似乎已经解决了它是否是一个数组的问题。仍然没有回答我的问题,即为什么如果 q.all 没有返回一个承诺数组,即使在调用 q.all 之前,在调用它的函数中也不会发生任何事情。

【问题讨论】:

entity 在那个 keepICorrect() 函数中是什么?参数为security,循环中使用security entity 是一个在服务中声明和获取的数组。 security 在我的 for 循环中传递给我的 getDataFromREST() 函数。 不应该是return $q.all吗? if (entity === Array)entity 与全局 Array 构造函数进行比较。它不会测试entity 是否是一个数组。 这肯定是您检查 var 是否为数组的方式...***.com/questions/767486/… 【参考方案1】:

请注意,Promise 库将所有​​抛出的错误封装在括号中的代码中,因此非常建议您在将函数封装到 Promise 机制中之前对其进行测试。

在你的情况下:

keepICorrect: function (security) 

        var promises = [];
            for (var i = 0 ; i < entity.length; i++) 
                promises.push(this.getDataFromREST(security, i));
            
         return promises;
    ,

你说它是一个闭包,所以我认为this.getDataFromREST 应该是undefined。请尝试逐步添加正确的代码,以免隐藏错误并删除代码中的错误。

【讨论】:

不确定你的意思,你是在暗示我隐藏了不正确的代码吗? this.getDataFromREST 未定义,值传递正确。 我的意思是我运行你的情况几次。在这两种情况下,我都无法在控制台上读取任何错误,因为 Promise 库将任何运行时错误包装在一种 catchAll  逻辑中。关于我应该是的错误:在您发布的代码中,调用getDataFromREST 而不是this.getDataFromREST 似乎会更好。

以上是关于为啥,如果 `$q.all` 没有返回一个 promise 数组,那么不会抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章

关于angularjs异步操作后台请求时,用$q.all排列先后顺序的问题

在 Jscript 中为 Q.all() 构建动态函数数组

mac pro 装了idk 8 为啥终端里面没有

qt为啥raise没有效果

adobe reader 9.0 pro里为啥都没有OCR文本识别这个选项?

如果函数没有明确使用'ret',为啥没有返回值