【问题标题】:How do I queue events in a Javascript Loop如何在 Javascript 循环中对事件进行排队
【发布时间】:2015-09-30 09:14:14
【问题描述】:

我有一个数组可以创建两个人之间的对话,它在浏览器说话和浏览器收听之间“翻转”。

短版,如何让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 deferredJavascript Q 我该怎么做呢?

【问题讨论】:

  • 不管实际问题如何,请注意:您不断更改同一个对象 (speak),将其推送到数组不会复制!
  • Promisify 语音合成API调用(听onend)然后queue them in a loop

标签: javascript jquery queue


【解决方案1】:

您不是在创建对象队列,您只是在隐藏相同的对象并将其再次推送到 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 等数组方法来处理您需要的数据。

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

【讨论】:

  • 对不起,你能澄清一下吗?每次使用 var speak = {} 将其推送到 speaks 数组时都会重置(即编辑)。所以speaks 数组包含短语,回调在speakThePhraselistenAndCompare 函数内。
  • 数组中的每个对象都将引用相同的数据,您不是使用 push 方法创建对象的副本,您只是更改了对内存中数据的引用。跨度>
  • 有了这个小提琴,jsfiddle.net/macgroover/xwq26Lak/2 就会出现正确的话语。我不确定我是否理解这个问题。
  • 查看我更新的评论,也许可以帮助您理解我对如何创建对象的想法。
  • 谢谢 - 我很感激。但我仍然看不出您创建的var speak 与我的示例中的var speaks 有何不同。 (实际上,speaks 数组可以是任意长度,因为它是从 HTML 中的对话中获取的)。
猜你喜欢
  • 2021-08-24
  • 1970-01-01
  • 2018-09-18
  • 2021-12-07
  • 1970-01-01
  • 2023-03-10
  • 2022-11-27
  • 2015-04-08
  • 2023-03-29
相关资源
最近更新 更多