当前位置:  开发笔记 > 编程语言 > 正文

以角度解决包裹的承诺

如何解决《以角度解决包裹的承诺》经验,为你挑选了1个好方法。

我对角度很新,而且我被推进了一个相当大的项目.我有一个情况,我已简化为以下代码:

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语句放入函数(例如,在promiseArrayresolve和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都让我对承诺有了更好的理解.它没有回答这个问题(因为我错误地定义了问题),但它肯定非常有用.谢谢!



1> Andrew Tomli..:

乍一看似乎是在使用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概念有一个漂亮的(非常简单的)插图,在这里被解释为卡通片.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有