在另一个函数完成后执行 jQuery 函数

Posted

技术标签:

【中文标题】在另一个函数完成后执行 jQuery 函数【英文标题】:Execute jQuery function after another function completes 【发布时间】:2013-11-09 13:29:06 【问题描述】:

我想在另一个自定义函数完成后执行一个自定义 jQuery 函数 第一个函数用于创建“打字”效果

function Typer()

    var srcText = 'EXAMPLE ';
    var i = 0;
    var result = srcText[i];
    setInterval(function() 
        if(i == srcText.length) 
            clearInterval(this);
            return;
        ;
        i++;
        result += srcText[i].replace("\n", "<br />");
        $("#message").html( result);
    ,
    100);


第二个函数播放声音

function playBGM()

    document.getElementById('bgm').play();

我一个接一个地调用函数

Typer();
playBGM();

但是随着文本的输入,声音开始播放。 我只想在打字完成后播放声音。

这是我尝试过的:http://jsfiddle.net/GkUEN/5/

我该如何解决这个问题?

【问题讨论】:

如果在function Typer() 的末尾,在100); 之后插入playBGM(); 怎么办?这里的例子jsfiddle.net/GkUEN/99 【参考方案1】:

你应该使用回调参数:

function Typer(callback)

    var srcText = 'EXAMPLE ';
    var i = 0;
    var result = srcText[i];
    var interval = setInterval(function() 
        if(i == srcText.length - 1) 
            clearInterval(interval);
            callback();
            return;
        
        i++;
        result += srcText[i].replace("\n", "<br />");
        $("#message").html(result);
    ,
    100);
    return true;




function playBGM () 
    alert("Play BGM function");
    $('#bgm').get(0).play();


Typer(function () 
    playBGM();
);

// or one-liner: Typer(playBGM);

因此,您将函数作为参数 (callback) 传递,该函数将在 if 之前在 return 中调用。

另外,this 是一篇关于回调的好文章。

function Typer(callback)

    var srcText = 'EXAMPLE ';
    var i = 0;
    var result = srcText[i];
    var interval = setInterval(function() 
        if(i == srcText.length - 1) 
            clearInterval(interval);
            callback();
            return;
        
        i++;
        result += srcText[i].replace("\n", "<br />");
        $("#message").html(result);
    ,
    100);
    return true;
        
    


function playBGM () 
    alert("Play BGM function");
    $('#bgm').get(0).play();


Typer(function () 
    playBGM();
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div id="message">
</div>
<audio id="bgm" src="http://www.freesfx.co.uk/rx2/mp3s/9/10780_1381246351.mp3">
</audio>

JSFIDDLE

【讨论】:

或者干脆Typer(playBGM); @PaulDraper 是的,没错,因为playBGM 是一个函数。 正是我想要的。谢谢! @Riturajratan 存在替换问题,而不是回调问题。我假设代码是正确的。【参考方案2】:

Deferred Promise 是一种将函数执行整齐而轻松地链接在一起的好方法。无论是 AJAX 还是普通函数,它们都提供了比回调更大的灵活性,而且我发现更容易掌握。

function Typer()

var dfd = $.Deferred();
    var srcText = 'EXAMPLE ';
    var i = 0;
    var result = srcText[i];

更新:

////////////////////////////////

  var timer=    setInterval(function() 
                    if(i == srcText.length) 

    // clearInterval(this);


       clearInterval(timer);

////////////////////////////////


   dfd.resolve();
                        ;
                        i++;
                        result += srcText[i].replace("\n", "<br />");
                        $("#message").html( result);
                ,
                100);
              return dfd.promise();
            

我已经修改了 play 函数,所以当音频播放完毕时它会返回一个 promise,这可能对某些人有用。第三个函数在声音播放完毕时触发。

   function playBGM()
    
      var playsound = $.Deferred();
      $('#bgm')[0].play();
      $("#bgm").on("ended", function() 
         playsound.resolve();
      );
        return playsound.promise();
    


    function thirdFunction() 
        alert('third function');
    

现在用以下代码调用整个事情:(请务必使用 Jquery 1.9.1 或更高版本,因为我发现 1.7.2 一次执行所有函数,而不是等待每个函数解决。)

Typer().then(playBGM).then(thirdFunction);  

在今天之前,我没有运气以这种方式使用延迟承诺,终于掌握了它。精确定时、链式接口事件在我们想要的时候发生,包括异步事件,从来都不是一件容易的事。至少对我来说,我现在可以控制它,这主要归功于其他人在这里提出问题。

【讨论】:

"THIS" 关键字在 clearInterval(this) 中无效 sqlchild,好吧,我不知道我只是从 OP 的功能中提取了那部分。不过它仍然有效,我在发布之前运行了它,它没有抛出任何错误。但如果你说它无效,我不会争论!【参考方案3】:

您也可以使用自定义事件:

function Typer() 
    // Some stuff

    $(anyDomElement).trigger("myCustomEvent");



$(anyDomElement).on("myCustomEvent", function() 
    // Some other stuff
);

【讨论】:

好主意,但您应该编写与问题更相关的代码【参考方案4】:

你可以使用下面的代码

$.when( Typer() ).done(function() 
       playBGM();
);

【讨论】:

如何组合多个功能?例如当 1 完成开始 2 当 2 完成开始 3 这个答案不完整,它不会单独工作。延迟对象需要在 Typer 函数和链中的任何其他函数中定义,以及解析和返回承诺。只有在打字功能完成后才会播放声音。 @SchweizerSchoggi 组合多个功能:Typer().then(playBGM).then(ThirdFunction).then(yetAnotherFunction); 确保您使用的是 JQuery 3.2.1,因为这不适用于 Jquery 1.71,因为我在 JSFiddle 发现上浪费了 15 分钟。 为什么这段代码对我不起作用?我是否缺少任何图书馆或其他东西?! :// 如何将参数从第一个函数传递到第二个函数

以上是关于在另一个函数完成后执行 jQuery 函数的主要内容,如果未能解决你的问题,请参考以下文章

Angular / TypeScript - 在另一个函数完成后调用一个函数

如何在另一个 lambda 之后执行 AWS lambda

jQuery mmenu 插件完成激活后是不是有回调或任何其他方式来执行函数?

Vue 在页面加载结束后执行某个函数

jQuery Callback 函数

并行执行多个 AJAX 请求,并在所有请求完成后运行一个函数