【问题标题】:Wait until function finish to run another function等到函数完成运行另一个函数
【发布时间】:2019-11-14 16:09:12
【问题描述】:

我遇到了一个让我疯狂 10 天的问题...基本上我有一个可以触发的函数(handleText),我想在运行第二个函数之前等待该函数结束( handleBackground)。

我尝试过 deferred 和 promise,但我认为我不太了解它们,因为我无法让它按照我想要的方式工作。

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 start 和 handleBackground(我想在第一个函数完成后运行的第二个函数)同时触发,而不是等待 handleText 完成。

我希望handleText 运行并等待每个循环为使用blast.js 创建的每个跨度提供类,然后再运行handleBackground

有人可以帮我解决这个问题吗? 祝大家有美好的一天:)

【问题讨论】:

  • setTimeout()回调中调用handleBackground()

标签: javascript jquery each jquery-deferred deferred


【解决方案1】:

在您的函数之外定义延迟,每次迭代都会增加延迟,以便下一个是上一个之后的随机时间。

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);
});

【讨论】:

    【解决方案2】:

    我建议设置一个全局变量 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);
    

    【讨论】:

    • 多么天才的想法!为什么我从来没想过...它就像一个魅力,谢谢:)
    • 呵呵,谢谢你的好话 kkqe - 很高兴我能帮上忙!
    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 2012-08-20
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多