0

我想说当这个函数 close() 完成时运行这个函数 init()。但这对我不起作用。

$.when(close(toolTip)).done(init(toolTip, anchor));

我没有将 $.when 用于任何与 ajax 相关的事情,只是试图确保在调用 init() 之前完成 close(),并且不,我不能在 close() 的末尾粘贴 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()。

4

3 回答 3

1

Simply return toolTip:

return toolTip.fadeOut(...

using the callback to resolve a deferred object can result in odd results if there are more than one elements selected for whatever reason.

This works because jQuery objects have a .promise method that when called, return a promise object that resolves when all active animations are completed. $.when calls .promise on all passed in arguments.

You'll also need to call init differently, for example,

$.when(close(toolTip)).done(function(){
    init(toolTip, anchor);
});

And, as pointed out by others, you could then shorten that to

close(toolTip).promise().done(function(){
    init(toolTip, anchor);
});
于 2013-03-04T22:01:46.977 回答
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();
};
于 2013-03-04T21:58:36.880 回答
1

$.whenDeferred's一起使用。它返回一个新的,当您提供的所有 'Deferred都解决时,它将解决。Deferred

由于close()似乎没有返回 Promise,when立即解决(根据.when()

但是,如果close()是同步的,则根本不需要when()。如果它异步的,则需要返回 a Promise,并在动画或其他任何内容完成时解析它;

function close(what) {
    var promise = jQuery.Deferred();

    what.fadeOut('slow', function () {
        promise.resolve();
    });

    return promise.promise();
}

...但您仍然不需要$.when,因为只涉及1 个承诺。$.when仅在多个 Promise 起作用时才有用。

close(toolTip).done(function () {
    init(toolTip, anchor);
});

另请注意,done(init(tooltip, anchor))init立即调用,并将该函数调用的结果done()传递给; 相反,您需要传递一个函数来完成。由于init需要参数,我们通过引入匿名函数解决了这个问题。如果init不需要任何参数,它会很简单:

close(toolTip).done(init);
于 2013-03-04T21:58:50.213 回答