我如何在Javascript循环中排队事件

How do I queue events in a Javascript Loop

本文关键字:排队 事件 循环 Javascript      更新时间:2023-09-26

我有一个数组,它创建了两个人之间的对话,它在浏览器说话和浏览器倾听之间"翻转"。

简而言之,我如何使saySomething队列

 for(var i=0; i < speaks.length; i++) {
     saySomething(speaks[i]);    // saySomething should wait for the previous loop to complete
 }
长版

var speak = {}; var speaks = [];
speak.utter = "What do they call a quarter pounder with cheese in Paris?"
speak.speaker = true;
speaks.push(speak);
var speak = {}; 
speak.utter = "They don't call it a quarter pounder with cheese?"
speak.speaker = false;
speak.time = 3;  // listen for 3 seconds
speaks.push(speak);
var speak = {}; 
speak.utter = "They got the metric system. They call it a Royale with cheese"
speak.speaker = true;
speaks.push(speak);
for(var i=0; i < speaks.length; i++) {    //foreach better?
        var speak = speaks[i];
        if(speak.speaker)
              speakThePhrase(speak);    // uses SpeechSynthesisUtterance
        else
              listenAndCompare(speak);  // uses webkitSpeechRecognition
        // don't attempt to speak while listening is happening and vice-versa
    }
 doSomethingElse();    don't process this till old the speaking/listening is done

最初我有一个递归循环移动数组,并做了与上面相同的事情,但我认为这种方式可能更容易控制队列。要么用jQuery递延,要么用Javascript,我该怎么做呢?

您不是在创建对象队列,您只是在阴影相同的对象并将其再次推入speaks数组,因此您将在数组中多次获得对象的最后版本。

如果你想创建一个异步行为,你应该尝试回调而不是简单的for循环。

最好这样做:

var speak = [
    {
        utter: "What do they call a quarter pounder with cheese in Paris?",
        speaker: true
    },
    {
        utter: "They don't call it a quarter pounder with cheese?",
        speaker: false,
        time: 3
    },
    {
        utter: "They got the metric system. They call it a Royale with cheese",
        speaker: true
    }
];

你可以使用数组方法如filtermap来处理你需要的数据。

最后,当应用程序中发生某些事情时,您可以使用事件来触发每次说话。