在一段真实代码中延迟

Deferreds in a piece of real code

本文关键字:真实 代码 延迟 一段      更新时间:2023-09-26

我对延迟和它们的作用有一些了解,但我无法理解它们在我现在正在使用的代码中的用法。这段代码来自jquery-file-upload插件和文件jquery-fileupload-ui.js:

stop: function (e) {
    var that = $(this).data('blueimp-fileupload') ||
            $(this).data('fileupload'),
        deferred = that._addFinishedDeferreds();
    $.when.apply($, that._getFinishedDeferreds())
        .done(function () {
            that._trigger('stopped', e);
        });
    that._transition($(this).find('.fileupload-progress')).done(
        function () {
            $(this).find('.progress')
                .attr('aria-valuenow', '0')
                .children().first().css('width', '0%');
            $(this).find('.progress-extended').html(' ');
            deferred.resolve();
        }
    );
},
_addFinishedDeferreds: function (deferred) {
    if (!deferred) {
        deferred = $.Deferred();
    }
    this._finishedUploads.push(deferred);
    return deferred;
},
_getFinishedDeferreds: function () {
    return this._finishedUploads;
},

在 stop 方法中,有两个我不明白的结构:

1(

$.when.apply($, that._getFinishedDeferreds())
.done(function () {
    that._trigger('stopped', e);
});

2(

deferred = that._addFinishedDeferreds();
//and later in the _transition function
deferred.resolve();

第二个构造在整个代码中重复。我可以看到_addFinishedDeferreds创建了一个延迟(如果它没有作为参数传递(,将其添加到_finishedUploads并且延迟稍后得到解决。但我错过了这一切的意义。它有什么好处?为什么没有它代码就无法工作?而且我完全不明白第一个构造的含义。任何人都可以对此有所了解吗?

首先我假设你了解Deferreds的基本用法,包括resolve()$.when()

根据我对这个代码片段的理解,每次创建新Deferred时,都会多次调用 stop 函数,并且在转换完成之前不会解析,尽管我不知道它是什么转换,因为您没有向我们展示它的代码。这里的Deferred对象是发出转换完成的信号,然后触发stopped事件。

1(

$.when.apply($, that._getFinishedDeferreds())
.done(function () {
    that._trigger('stopped', e);
});

$.when.apply($, that._getFinishedDeferreds()) 生成一个新Deferred,在 _getFinishedDeferreds() 返回的数组中解析每个Deferred后,将解析该。然后,done()中的回调函数触发stopped事件。

2(

deferred = that._addFinishedDeferreds();
//and later in the _transition function
deferred.resolve();

你的理解是正确的。这段代码(如果我猜对的话(的目的是确保在所有转换完成之前不会触发事件。

但是,如果是这样,则存在事件触发回调的错误:

function () {
    that._trigger('stopped', e);
}

每次调用 stop() 时附加,因此可以多次触发事件。