在一段真实代码中推迟

时间:2013-11-17 23:16:01

标签: javascript jquery jquery-deferred jquery-file-upload

我对Deferreds及其所做的事情有所了解,但我无法理解他们在我正在使用的一段代码中的用法。此代码来自jquery-file-upload plugin和文件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并且延迟后来被解析。但我错过了这一切的含义。到底有什么好处呢?没有它,为什么代码无法工作?我根本不理解第一个构造的含义。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

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

根据我对此代码段的理解,stop函数将被多次调用,每次创建一个新的Deferred并且在转换完成之前不会被解析,尽管我不知道知道它是什么过渡,因为你没有向我们展示它的代码。这里的Deferred对象用于表示转换完成,然后触发stopped事件。

详细信息

1)

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

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

2)

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

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

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

function () {
    that._trigger('stopped', e);
}
每次调用stop()时都会附加

,因此可能会多次触发事件。