我对角度很新,而且我被推进了一个相当大的项目.我有一个情况,我已简化为以下代码:
var beforeClose = function() {
var closeDeferred = $q.defer(),
a = $q.defer(),
b = $q.defer(),
c = $q.defer(),
promiseArray = [a.promise, b.promise, c.promise];
/* logic that resolves or rejects a, b, and c */
$q.all(promiseArray).then(
function() {
closeDeferred.resolve();
},
function() {
closeDeferred.reject();
}
);
return closeDeferred.promise;
}
var modalClose = function() {
beforeClose().then(
function() {
//close the modal
},
function() {
//warn and don't close modal
}
)
}
使用Chrome的DevTools,似乎代码在完全解决或拒绝之前返回了closeDeferred
承诺.所以我猜我的问题是这样的, promiseArray
什么时候承诺退回?可以在解决或拒绝之前退回吗?如果没有,我怎么能阻止它返回?
将return语句放入函数(例如,在promiseArray
resolve和reject函数中)会使该函数返回promise,但不一定将该promise发送给modalClose
(它触发了第一个promise).
或许我了解我的代码发生了什么.当我将返回closeDeferred
函数放入另一个函数时,我遇到错误,说.then()
不能在undefined上调用(指向该beforeClose().then()
行).
编辑:在查看安德鲁的答案后,我不得不更新代码,并且更具体地说明正在发生的事情.问题不一定是在我想要它之前返回了promise,它就是它正在执行该promise的resolve函数 - 它关闭了模态,即使promiseArray()
还没有完成它的事情.
编辑2:所以看起来,在简化代码结构时,我实际上删除了我的真正问题.在承诺的各种设置中,事实证明我在返回语句之前从未将closeDeferred定义为延迟或承诺.因此,当循环机制完成它应该做的事情时,它也返回closeDeferred.promise,未定义,我猜?所以modalClose函数在任何promises被解析/拒绝之前运行.然后在下一个循环中,最终定义了closeDeferred并且promises正确地起作用.
不过,我真的很感激所给予的帮助.@ andrew-tomlinson和@georgeawg都让我对承诺有了更好的理解.它没有回答这个问题(因为我错误地定义了问题),但它肯定非常有用.谢谢!
乍一看似乎是在使用Defer对象加载promiseArray.根据文档(在这里找到:https://docs.angularjs.org/api/ng/service/ $ q),似乎all()方法需要一个Promise对象数组.
要从Defer对象获取承诺,您可以将其作为属性访问:
var myDeferedObj = $q.defer(); var myPromiseObj = myDeferedObj.promise;
然后你将使用promiseArray中的promise对象.在您的示例中实现的这个想法将改变它看起来像:
a = $q.defer().promise, b = $q.defer().promise, c = $q.defer().promise, promiseArray = [a,b,c];
注意,我没有亲自测试过,但是如果你仍然卡住了,你可以尝试一下.祝好运!
编辑:在更深入地阅读您的一些问题之后,我觉得我需要改变我的回答以解决一些具体问题.如果你已经知道这一点,我很抱歉,我错过了问题的重点.
"承诺何时归还?"
return
方法执行时,从函数返回Promise对象.返回promise对象在概念上与解析或拒绝promise无关.返回Promise对象通常是为了在应用程序中传递Promise的引用.在您的示例中,您将Promise对象从beforeClose()
函数传递给modalClose()
函数.在承诺被解决或拒绝之前,Promise对象(使用.then(function(){},function(){})
)内提供的回调函数modalClose()
将不会执行.
"它可以在解决或拒绝之前归还吗?"
是的,Promise对象closeDeferred.promise
将立即返回beforeClose()
,但是根据我对示例代码的理解,在promiseArray中的promise被集体解决或拒绝之前,不应该解析或拒绝它.也就是说,return closeDeferred.promise;
它不是一个阻塞语句,并且将像函数末尾的任何正常return语句一样执行.
Promise概念有一个漂亮的(非常简单的)插图,在这里被解释为卡通片.