Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript循环中对事件进行排队_Javascript_Jquery_Queue - Fatal编程技术网

如何在Javascript循环中对事件进行排队

如何在Javascript循环中对事件进行排队,javascript,jquery,queue,Javascript,Jquery,Queue,我有一个数组,它可以在两个人之间创建对话,在说浏览器和听浏览器之间“翻转” 简短的版本,如何让说点什么排队 for(var i=0; i < speaks.length; i++) { saySomething(speaks[i]); // saySomething should wait for the previous loop to complete } for(变量i=0;i

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

简短的版本,如何让
说点什么
排队

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

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
var speak={};var=[];
speak.utter=“在巴黎,人们把四分之一磅的奶酪面包叫做什么?”
speak.speaker=true;
说话。推(说话);
var speak={};
speak.utter=“他们不叫它四分之一磅奶酪?”
speak.speaker=false;
speak.time=3;//听3秒钟
说话。推(说话);
var speak={};
speak.utter=“他们有公制。他们称之为奶酪皇室”
speak.speaker=true;
说话。推(说话);
对于(var i=0;i

最初我有一个递归循环来移动数组,并执行与上面相同的操作,但我认为这种方法可能更容易控制队列。因此,使用或如何执行此操作?

您并不是在创建对象队列,而是对相同的对象进行阴影处理,然后将其再次推入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
    }
];
然后您可以使用数组方法,如
filter
map
来处理所需的数据


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

不管实际问题如何,请注意:您不断更改同一对象(
speak
),将其推到数组上不会生成副本!语音合成API调用(听ONED)然后。对不起,你能澄清一下吗。每次使用
var speak={}
将speak推入speak数组时,speak都会被重置(这是编辑)。因此,
speaks
数组包含短语,回调在
speakThePhrase
listedandcompare
函数中。数组中的每个对象都将引用相同的数据,您没有使用push方法创建对象的副本,您只是在更改内存中数据的引用。使用此小提琴,可以显示正确的语句。我不确定我是否理解这个问题。查看我的最新评论,也许可以帮助你理解我关于如何创建对象的想法。谢谢-我很感激。但是我仍然不知道您创建的
var speak
与我的示例中的
var speak
有什么不同。(实际上,speaks数组可以是任意长度的,因为它是从HTML中的对话中获取的)。