2013-06-27 25 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(); 

}