我对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并且延迟后来被解析。但我错过了这一切的含义。到底有什么好处呢?没有它,为什么代码无法工作?我根本不理解第一个构造的含义。任何人都可以对此有所了解吗?
答案 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()
时都会附加,因此可能会多次触发事件。