为啥,如果 `$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排列先后顺序的问题