【问题标题】: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 是否为数组的方式...stackoverflow.com/questions/767486/…

标签: javascript angularjs asynchronous promise


【解决方案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 似乎会更好。
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2019-06-13
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多