2013-06-27 24 views
2

我只想在完成上一個自定義函數之後才執行自定義函數。jquery運行後自定義函數完成

我嘗試了承諾,完成和時,但它不能正常工作。最前一頁功能執行第二時沒有完全做到......

例如,我想執行功能1(),然後執行,只有當功能1完成功能2:

function1(); 
function2(); 

我試着用這個,但它不工作:

promise(function1()).done(function2); 

這裏我功能1的腳本:

function function1() { 

    nbofslides = $('.Slide img').length; 
    currentslide = 1; 

    if (nbofslides == currentslide) { 

     if (nbofslides > 1) { 
      for (i = 1 ; i <= nbofslides ; i++) { 
       if (i == 1) { 
        $('.slider-pagination').append('<li class="slider-page selected bgcolor2"></li>'); 
       } else { 
        $('.slider-pagination').append('<li class="slider-page bgcolor2"></li>'); 
       } 
      } 
     } 

     $('.iosSlider').iosSlider({ 
      responsiveSlideContainer: true, 
      responsiveSlides: true, 
      snapToChildren: true, 
      desktopClickDrag: true, 
      keyboardControls: true, 
      infiniteSlider: true, 
      navSlideSelector: true, 
      autoSlide: false, 
      navNextSelector: $('.slider-next'), 
      navPrevSelector: $('.slider-prev'), 
      navSlideSelector: $('.slider-pagination .slider-page'), 
      onSlideChange: slideChange 
      }); 

     var setHeight = $('.iosSlider .Slide:eq(0)').outerHeight(true); 
     $('.iosSlider').css({ 
      height: setHeight 
     }); 

     function slideChange(args) { 
     $('.slider-pagination .slider-page').removeClass('selected'); 
     $('.slider-pagination .slider-page:eq(' + (args.currentSlideNumber - 1) + ')').addClass('selected'); 
     } 

    } 
    currentslide++; 

} 
+0

你有你的第一個函數調用Ajax? –

+0

我沒有在function1中的任何異步任務... ... – freaky

+0

你不能只是這樣做 - >'function1(); function2();' –

回答

3

功能1完成時,必須通知功能2(或執行功能2的功能)。

var deferredObj = $.Deferred(); 

var function1 = function() { 
    ... do some stuff ... 
    ... and an ajax request ... 
    $.ajax(...).done(function(){ 
     deferredObj.resolve(); 
    }); 
} 

deferredObj.done(function(){ 
    function2(); 
}); 

然而,jQuery讓這甚至通過使$就承諾物體更容易。

var function1 = function() { 
    return $.ajax(...); 
} 

function1().done(function2) 
+0

謝謝您的回答。但我不明白你怎麼在ajax裏寫東西。成功的方法可能? – freaky

+0

爲什麼你需要在ajax裏寫東西?在這一點上,你很難清楚你想要做什麼或者你的問題是什麼。你能否提供更多示例代碼?你首先說你沒有做任何異步的事情,現在你在談論Ajax。 Ajax是異步的。 –

+0

我做了很多東西。我有一些如果條件,一些jQuery插件初始化,一些css技巧和其他功能在裏面...我認爲延期方法將是我的情況下最好的方式,但我從來沒有使用過,我認爲我寫錯了...... – freaky

1

不容易的,因爲大部分功能不需要任何「時間」來完成的,他們只是「做了一堆的命令」,而下一個函數被調用後。

在jQuery的動畫的情況下,它就像一條流淌的是(通過JQuery的API代碼)

var div = $("div"); 
div.show("slow"); 
div.animate({left:'+=200'},2000); 
div.slideToggle(1000); 
div.slideToggle("fast"); 
div.animate({left:'-=200'},1500); 
... 

如果,如果我們想用動畫隊列爲我們自己的功能,我們可以使用:

var div = $("div"); 
div.show("slow"); 
div.animate({left:'+=200'},2000); 
div.slideToggle(1000); 
div.slideToggle("fast"); 
div.queue(function() { 
    alert('We are now at step 4 and if you press OK we go to 5.'); 
    $(this).dequeue(); 
}); 
div.animate({left:'-=200'},1500); 
... 

我希望這就是你正在尋找的。

如果沒有,請記住,jQuery的動畫有成功的,功能的內置的解決方案:

div.animate({left:'-=200'},1500,function(){ 
    // if animation done, use this code here 
}); 

如果你想耽誤你的命令也有東西給你:

div.delay(800).effect("pulsate", {}, 2000).delay(800).queue(someOtherFunction); 

在這種情況下,我們將等待800毫秒,比使用脈動效應(2000毫秒),等待另一個800毫秒,並啓動「someOtherFunction」。

+0

謝謝您的回答,但我使用不能使用延遲參數的函數。這不是動畫......我總是儘量避免等待時間... – freaky

+0

嗯,我不知道你想用它做什麼。基本上這就是3種不同的解決方案。 – Proximo

0
$('a.button').click(function(){ 
    if (condition == 'true'){ 
     function1(someVariable, function() { 
      function2(someOtherVariable); 
     }); 
    } 
    else { 
     doThis(someVariable); 
    } 
}); 


function function1(param, callback) { 
    ...do stuff 
    callback(); 

}