是否可以创建一个创建自己的Deferred对象的函数,当函数有Deferred.resolved时,继续使用Deferred.then方法?或者我是否必须在函数外部创建Deferred对象,将其传入然后返回已解析的对象?
JS
function hide() {
$.when(fadeElementOut(this.$el)).then(() => this.dispose());
}
function fadeElementOut($el) {
if($el) {
let $deferred = $.Deferred();
$el.addClass(config.stateClasses.hidden);
$el.on('transitionend', (event) => {
if(event.originalEvent.propertyName === 'opacity') {
return $deferred.resolve();
}
});
}
}
答案 0 :(得分:2)
是的,它不仅可行,而且还建议在函数内创建最终导致其解析的延迟对象。但是,$.when
不会神奇地检测到延迟的存在,而是你必须return
延期的承诺:
function hide() {
fadeElementOut(this.$el).then(() => this.dispose());
}
function fadeElementOut($el) {
const deferred = $.Deferred();
if ($el) {
$el.addClass(config.stateClasses.hidden);
$el.on('transitionend', event => {
if (event.originalEvent.propertyName === 'opacity') {
deferred.resolve();
// a `return` here is pointless
}
});
} else {
deferred.resolve(); // when there is no element, fulfill the promise immeidately
}
return deferred.promise();
// ^^^^^^
}