JavaScript 函数拒绝按顺序执行

Posted

技术标签:

【中文标题】JavaScript 函数拒绝按顺序执行【英文标题】:JavaScript function refuses to execute in order 【发布时间】:2017-05-18 11:23:38 【问题描述】:

下面顶部函数中的一个 case 语句不按顺序进行。目前,它直接进入提示,如果您单击取消,则根本不会听到operatorPickup。如果我输入“police”,我会得到警察记录,它在 当前函数的 end 调用的另一个函数中 并且 then I获取OperatorAnswer,这完全没有意义,它按照 2、3、1 的顺序进行 - 当 3 甚至不在同一个函数中时!

根据以前的经验,我尝试延迟提示,以防警报、提示或确认阻止 UI 并优先处理,但这也无济于事。

function response() 
        switch(number) 
            case "0":
                var operatorPickup = new Audio('OperatorAnswer.wav');
                operatorPickup.play();
                setTimeout(function() 
                    number = prompt("Operator, your number please? (Numbers only; enter 'police' for police and emergency)");
                    number = number;
                    operatorPutCallThrough();
                , 9);
                break;
            case "911":
                var pickup911 = new Audio('911-xxx-fleet.mp3');
                pickup911.play();
                break;
            case "18477651008":
                var pickupMCI = new Audio('MCI.wav');
                pickupMCI.play();
                break;
            case "8675309":
                var pickup8675309 = new Audio('discoornis-bell-f1.mp3');
                pickup8675309.play();
                break;
            case "police":
                break;
            default:
                var pickupDefault = new Audio('ldcircuits-bell-f1.mp3');
                pickupDefault.play();
        
    
    function operatorPutCallThrough() 
        if (number == "police") 
            var operatorPoliceTransfer = new Audio('OperatorPolice.wav');
            operatorPoliceTransfer.play();
        
        response();
    

如何强制 switch(number) 中的 case "0" 按顺序执行

【问题讨论】:

【参考方案1】:

您可以在play() 上使用事件监听器,这样它只会在媒体文件播放完毕后提示。

到目前为止,我从未使用过 html5 的 audio,但这个问题:Detecting when HTML5 audio is finished playing (more than once)? 建议您如何收听该事件,以便您尝试:

operatorPickup.addEventListener("ended", function()
    number = prompt("Operator, your number please? (Numbers only; enter 'police' for police and emergency)");
    number = number;
    operatorPutCallThrough();
);

之前operatorPickup.play();

【讨论】:

如果我这样做,根本不会播放任何录音,但不会弹出警告框。一切都停止了 这没有意义...您在控制台中有任何错误吗?您是否在var operatorPickup = new Audio('OperatorAnswer.wav');operatorPickup.play(); 之间添加了事件监听器? 我在 var operatorPickup 定义之前也有它,解决了它!【参考方案2】:

如果单击取消,变量 number 将设置为 null,这不在 case 语句中。如果您想在 null 和 0 上处理相同的情况,您应该在 case "0" 的上方或下方添加 case null。如果在下一个 case 之前没有 break,则 switch 语句将执行下一个 case,依此类推,因此您可以堆叠 case 语句而不会中断应该为任何一种情况执行的代码。

【讨论】:

嗯...我尝试设置 var previousNumber = number 然后在 case 0 运行后将 number 更改为 previousNumber 如果 number 为空...但是 consoleLog 没有报告任何一个...跨度>

以上是关于JavaScript 函数拒绝按顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

《疯狂Java讲义》 2-理解面向对象

javascript accumulate():按顺序执行promises或promise-returns函数数组,并使用给定的累加器减少结果

javaScript代码执行顺序

多部分javascript函数

如何确保JavaScript的执行顺序

JavaScript 变量提升,函数提升