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

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);
});
于 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

$.whenで動作しDeferredますDeferred指定したすべての が解決されたときに解決されるnew を返しますDeferred

close()Promise を返していないようで、すぐwhenに解決さwhen()ます ( .

ただし、close()同期の場合はまったく必要ありませんwhen()。非同期の場合Promise、 を返し、アニメーションなどの完了時に解決する必要があります。

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

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

    return promise.promise();
}

...しかし、プロミスが1 つ$.whenしかないため、まだ必要ありません。複数の約束が行われている場合にのみ役立ちます。$.when

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

done(init(tooltip, anchor))initすぐに呼び出され、その関数呼び出しの結果が に渡されることにも注意してくださいdone()。代わりに、 doneに関数を渡す必要があります。パラメータが必要なためinit、無名関数を導入することでこれを修正しました。initパラメーターが必要ない場合は、次のように簡単です。

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