繁体   English   中英

如何使用$ .when作为回调函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM