等到函数完成运行另一个函数

时间:2019-07-03 23:38:30

标签: javascript jquery each jquery-deferred deferred

我遇到了一个让我快疯了大约10天的问题...基本上,我有一个可以触发(handleText)的函数,我想等待该函数结束再运行一秒钟一个(handleBackground)。

我尝试了延期和承诺,但我认为我不太了解它们,因为我无法使其按我想要的方式工作。

function handleText(){
    //BLAST INIT    
    var blastedwords = $('.baselineHeader').blast({
        delimiter: 'word',
    });

    //SHUFFLE ORDER IN ARRAY
    blastedwords = shuffleAds( blastedwords);
    function shuffleAds(arr){
        for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
        return arr;
    }

    //ADD CLASS TO SPAN CREATED WITH BLAST WITH A RANDOM DELAY
    blastedwords.each(function(index) {
        var min = 45, max = 100;
        var delay = Math.floor(Math.random() * (max - min) + min);
        var that = $(this);
        var t = setTimeout(function() {
            $(that).addClass("test");
        }, delay * index);
    });
}

function handleBackground(){
    $('.baselineHeader').addClass('processed');
}

handleText();
handleBackground();

现在,handleText开始运行,handleBackground(我要在第一个函数完成后运行的第二个函数)同时启动,并且不等待{{1} }完成。

我希望handleText运行并等待每个循环将类赋给blast.js创建的每个span,然后再运行handleText

有人可以帮我吗? 祝大家有美好的一天:)

2 个答案:

答案 0 :(得分:1)

我建议设置一个全局变量 totalTime ,您可以使用该变量来累加单个延迟。这样,您可以在totalTime经过之后使用另一个setTimeout调用函数handleBackground()。

var totalTime = 0;
blastedwords.each(function(index) {
  var min = 45,
    max = 100;
  var delay = Math.floor(Math.random() * (max - min) + min) * index;
  totalTime += delay;
  var that = $(this);
  var t = setTimeout(function() {
    $(that).addClass("test");
  }, delay);
});
setTimeout(handleBackground, totalTime);

答案 1 :(得分:0)

在函数外部定义延迟,每次迭代都会增加延迟,因此下一个延迟是最后一个延迟之后的随机时间。

var delay = 0;

blastedwords.each(function(index) {
    var min = 45, max = 100;
    delay += Math.floor(Math.random() * (max - min) + min);
    var that = $(this);
    var t = setTimeout(function() {
        $(that).addClass("test");
    }, delay * index);
});