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

How do deferred statements, such as promise() and done(), work?

本文关键字:何工作 工作 done promise 延迟 语句      更新时间:2023-09-26

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

1st( 在此示例中,.promise() 被添加到 animate 中,其中 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 文档用 $.get 给出了这种示例,但不知道它与使用已经随 $.get() 提供的匿名函数回调有何不同:

   $.get("test.php", {},
        function (result) { 
            alert(result);
        }
     );

    $.get( "test.php" ).done(
        function(result) {
            alert(result);
        }
    );

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

promise 是一种跟踪延迟结果以使异步操作看起来像同步操作的方法。在您给出的链中只有一个链接的示例中,回调也同样有效。真正的力量在于多个环节,并允许错误冒泡到顶层进行处理。

对于第一个示例,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
});

您可以通过让 go 到链的末端来捕获沿途发生的任何错误。

为了进一步阅读,我建议你错过了承诺和[承诺反模式 https://github.com/petkaantonov/bluebird/wiki/Promise 反模式((来自蓝鸟。