2

我只想在之前的自定义功能完全完成后才执行自定义功能。

我尝试了承诺,完成以及何时,但它无法正常工作。执行第二个函数时,第一个函数没有完全完成......

例如,我想执行 function1() 然后仅在 function1 完成时执行 function2 :

function1();
function2();

我试过了,但它根本不起作用:

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

这是我的 function1 的脚本:

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++;

}
4

3 回答 3

4

You have to inform function 2 (or something that executes function 2) when function 1 is complete.

var deferredObj = $.Deferred();

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

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

However, jQuery makes this even easier by making $.ajax return a promise object.

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

function1().done(function2)
于 2013-06-27T20:29:32.453 回答
1

这并不容易,因为大多数函数不需要任何“时间”来完成,它们只是“执行一堆命令”,然后调用下一个函数。

如果是 JQuery-Animations,它会像这样运行(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”。

于 2013-06-27T20:38:43.290 回答
0
$('a.button').click(function(){
    if (condition == 'true'){
        function1(someVariable, function() {
          function2(someOtherVariable);
        });
    }
    else {
        doThis(someVariable);
    }
});


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

}

于 2014-08-01T10:24:34.657 回答