我想说当这个函数close()完成时运行这个函数init()。但它不适合我。
$.when(close(toolTip)).done(init(toolTip, anchor));
我没有使用$ .when来解决任何与ajax相关的问题,只是在调用init()之前尝试确保close()完成,并且我不能在close()结束时粘贴init() 。有什么想法吗?
好的就是关闭()
var close = function (toolTip) {
toolTip.fadeOut('fast', function (e) {
if (typeof e !== 'undefined') {
//Re-set values applied when initted
var toolTipBd = toolTip.find('.bd:first');
toolTip.css('width', '');
toolTipBd.css('max-height', '');
toolTip.css('max-height', '');
toolTipBd.css('overflowY', '');
}
});
};
否则close()可以调用init()。
答案 0 :(得分:1)
您的close()
实施应该是这样的:
var close = function (toolTip) {
var d = $.Deferred();
toolTip.fadeOut('fast', function (e) {
if (typeof e !== 'undefined') {
//Re-set values applied when initted
var toolTipBd = toolTip.find('.bd:first');
toolTip.css('width', '');
toolTipBd.css('max-height', '');
toolTip.css('max-height', '');
toolTipBd.css('overflowY', '');
}
d.resolve();
});
return d.promise();
};
答案 1 :(得分:1)
$.when
适用于Deferred
's。它会返回一个新的Deferred
,当您提供的所有Deferred
解析时,它会解析。
由于close()
似乎没有返回承诺,when
将立即解决(按docs for when()
。
但是,如果close()
是同步的,则根本不需要when()
。如果是异步,则需要返回Promise
,并在动画或其他任何内容完成时解析它;
function close(what) {
var promise = jQuery.Deferred();
what.fadeOut('slow', function () {
promise.resolve();
});
return promise.promise();
}
...但您仍然不需要$.when
,因为只涉及 1 承诺。 $.when
仅在多个承诺发挥作用时才有用。
close(toolTip).done(function () {
init(toolTip, anchor);
});
另请注意,done(init(tooltip, anchor))
会立即调用init
,并将该函数调用的结果传递给done()
;相反,你需要传递一个函数来完成。由于init
需要参数,我们通过引入匿名函数来解决这个问题。如果init
不需要任何参数,那就简单了:
close(toolTip).done(init);
答案 2 :(得分:1)
只需返回toolTip:
return toolTip.fadeOut(...
如果因任何原因选择了多个元素,则使用回调来解析延迟对象可能会导致奇怪的结果。
这是有效的,因为jQuery对象有一个.promise
方法,在调用时返回一个promise对象,该对象在完成所有活动动画时解析。 $.when
对所有传入的参数调用.promise
。
您还需要以不同方式调用init,例如
$.when(close(toolTip)).done(function(){
init(toolTip, anchor);
});
而且,正如其他人所指出的那样,你可以将其缩短为
close(toolTip).promise().done(function(){
init(toolTip, anchor);
});