[英]How to use $.when for a callback function?
我想说的是,当函数close()完成时,请运行该函数init()。 但这对我不起作用。
$.when(close(toolTip)).done(init(toolTip, anchor));
我没有将$ .when用于与ajax相关的任何事情,只是试图确保在调用init()之前完成close(),而且不,我不能在init()的结尾粘贴init()。 有任何想法吗?
好的,这里是close()
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()。
您的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();
};
$.when
作品与Deferred
的 。 它返回一个新的Deferred
当所有这将解决Deferred
的你提供的决心。
由于close()
似乎没有返回Promise,因此when
可以立即解决(根据when()
的文档when()
。
但是,如果close()
是同步的,则根本不需要when()
。 如果它是异步的,则需要返回Promise
,并在动画或其他完成时解决它;
function close(what) {
var promise = jQuery.Deferred();
what.fadeOut('slow', function () {
promise.resolve();
});
return promise.promise();
}
...但是$.when
只涉及1个诺言时,您仍然不需要$.when
.。 $.when
仅在多个诺言同时起作用时才有用。
close(toolTip).done(function () {
init(toolTip, anchor);
});
还要注意, done(init(tooltip, anchor))
将立即调用init
,并将该函数调用的结果传递给done()
; 相反,您需要传递一个函数来完成。 由于init
需要参数,因此我们通过引入匿名函数来解决此问题。 如果init
不需要任何参数,它就很简单:
close(toolTip).done(init);
只需返回工具提示:
return toolTip.fadeOut(...
如果出于任何原因选择了多个元素,则使用回调来解析延迟的对象可能会导致奇怪的结果。
这是.promise
,因为jQuery对象具有.promise
方法,该方法在被调用时返回一个promise对象,该对象将在所有活动动画完成时进行解析。 $.when
.promise
在所有传入的参数上调用.promise
时。
您还需要以不同的方式调用init,例如,
$.when(close(toolTip)).done(function(){
init(toolTip, anchor);
});
而且,正如其他人所指出的,您可以将其缩短为
close(toolTip).promise().done(function(){
init(toolTip, anchor);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.