延迟语句(如promise()和done())如何工作?

时间:2014-12-04 19:40:44

标签: javascript jquery

我需要帮助了解promise()done()等延迟方法的使用。

1st)在此示例中,.promise()被添加到动画中,之后调用done()

        var stack = new Array();

        $(document).ready(function() {
            $(".droppable").each(function(){
                stack.push(new Droppable($(this)));  
            });
            dropNext();
        });

        function dropNext(){
            var droppable = stack.pop();
            if(droppable){                  
                droppable.drop().done(dropNext);
            }
        }

        function Droppable(domElem) {

            function drop() {
                return domElem.animate(
                    {
                        opacity : "1"
                    }
                ).promise(); 
            }
            this.drop = drop;
        }

承诺的目的是什么?它是如何工作的?

2nd)jQuery文档给this sort of example $ .get,但不知道它与使用{{1}已经提供的匿名函数回调有什么不同}}:

$.get()

匿名函数是否已经是一个回调函数,用于返回从服务器返回时要解析的结果?

1 个答案:

答案 0 :(得分:1)

承诺是一种跟踪延迟结果的方法,以使异步操作看起来像同步操作。在您给出的链中只有一个链接的示例中,回调也可以正常工作。真正的力量在于多个链接,并允许错误冒泡到最高级别进行处理。

对于您的第一个示例,animate需要一些时间,因此返回在动画完成时解析的promise可以确保在下一个动画开始之前完成上一个动画。它说“我告诉你该做什么现在,但是在完成其他事情之前不要这样做。”如果你的列表stack在这里有5个元素,你可以循环并将它们与上面的代码链接在一起。要使用回调来执行此操作,您将拥有嵌套5级深度的回调。

承诺的责任是then,允许将多个操作链接在一起。查看$.get示例,假设您要执行多个彼此依赖的API调用:

$.get("test.php", {},
    function (result) { 
        $.post("test-details.php", {data: result}, function(detail) {
            $.get("test-content.php", {id: detail.id}, function(content) {
                // do content stuff
                // whoa, this is getting deep
            });
        });
    }
 );

你可以使用承诺来解决这个问题。

$.get( "test.php" ).then(function(result) {
    return $.post("test-details.php", {data: result});
}).then(function(detail) {
    return $.get("test-content.php", {id: detail.id});
}).then(function(content) {
   // do content stuff
});

你可以通过让链接结束来捕捉一直发生的任何错误。

如需进一步阅读,我建议You're missing the point of promises和[Promise Anit - https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)(来自Bluebird。)