2013-03-04 47 views
0

我想說當這個函數close()完成時運行這個函數init()。但它不適合我。

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

我不使用任何東西AJAX相關的。當$,只是想確保close()方法之前,我打電話的init(完成),並沒有我不能堅持到底的init() close()。有任何想法嗎?

確定這裏是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', ''); 
     } 
    }); 
}; 

無論在哪裏密切()可以調用它的init()。

+0

接近(提示)表演一些異步功能?如果是這樣,那個函數有回調嗎? – 2013-03-04 21:54:32

+3

我們需要看看'close()'做了什麼,它必須返回一個承諾或延遲對象來與'$ .when'一起使用,並且除非它返回一個函數,否則你對'init()'的調用是錯誤的。 – 2013-03-04 21:55:21

回答

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

$.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承諾涉及。 $.when只有在多重承諾在場時纔有用。

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

還要注意done(init(tooltip, anchor))會立即撥打init,並通過結果函數調用來done();相反,您需要通過函數完成。由於init需要參數,我們通過引入一個匿名函數來解決這個問題。使用回調以解決延遲對象可能會導致奇怪的結果,如果

return toolTip.fadeOut(... 

:如果init並不需要任何參數,它會一直這麼簡單:

close(toolTip).done(init); 
1

只需返回工具提示無論出於何種原因選擇了多個元素。

這是可行的,因爲jQuery對象有一個.promise方法,當被調用時,返回一個promise對象,該對象解析所有活動動畫完成的時間。 $.when對所有傳入的參數調用.promise

您還需要以不同的方式調用初始化,例如,

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

而且,正如其他人指出的那樣,你可以再縮短,要

close(toolTip).promise().done(function(){ 
    init(toolTip, anchor); 
}); 
相關問題