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

时间:2013-03-04 21:52:41

标签: javascript jquery

我想说当这个函数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()。

3 个答案:

答案 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);
});