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_Php_Arrays_Json_Timeout - Fatal编程技术网

Javascript 用于循环和顺序超时

Javascript 用于循环和顺序超时,javascript,php,arrays,json,timeout,Javascript,Php,Arrays,Json,Timeout,我正在尝试按顺序打印数组中的一些数据。数组具有以下格式:((文本,延迟),(文本,延迟)) 我希望每个超时在下一个超时结束后开始。我已经走了这么远,但我现在很难受。所有超时都使用此代码同时开始 <script> var data = JSON.parse('<?php echo json_encode($data); ?>'); for (i = 0; i < data.length; i++) { texttime = dat

我正在尝试按顺序打印数组中的一些数据。数组具有以下格式:((文本,延迟),(文本,延迟)) 我希望每个超时在下一个超时结束后开始。我已经走了这么远,但我现在很难受。所有超时都使用此代码同时开始

 <script>
    var data = JSON.parse('<?php echo json_encode($data); ?>'); 
    for (i = 0; i < data.length; i++) { 
        texttime = data[i];
         (function (x) {
            setTimeout(function () {document.write(x[0]) +"<br>"}, x[1]*1000);
        })(texttime);
    }
</script>

var data=JSON.parse(“”);
对于(i=0;i”},x[1]*1000);
})(文本时间);
}

谢谢

我认为您想要的是按特定的间隔顺序执行操作。我想这对你有帮助。我更新了我的答案,您的$data数组的json_编码将在下面的js数组中。 更新

var数据=[
[“彼得正在准备工作”,20],
[“彼得在火车上”,10],
[“彼得离开了车站,步行去上班”,10]
];
顺序_操作(数据,0);
函数序列_操作(arr,index){
setTimeout(函数(){
附加(“+arr[index][0]+”:“+arr[index][1]+”分钟”);
如果(索引)

var数据=[
{“value”:“这是第一个”},
{“value”:“这是第二个”},
{“value”:“这是第三个”},
{“value”:“这是forth”},
{“值”:“这是第五个”}
];
操作顺序(数据,0500);
函数序列_操作(arr,index,interval){
setTimeout(函数(){
$(“body”).append(“+arr[index].value”);

如果(index循环在这里不太起作用,因为在JavaScript中不能在for循环中等待。但是您也可以使用递归来迭代集合,并且由于setTimeout使用回调,您可以实现一种递归回调:您可以为您想做的第一件事设置超时,然后在回调中为此设置超时或者接下来的事情,依此类推,直到到达数组的末尾

以下是您如何做到这一点:

(function () {

    var contentIndex = 0, timeoutIndex = 1;
    var data = JSON.parse('<?php echo json_encode($data); ?>');

    timeoutIterate(0, exists, consume, timeout);

    function timeoutIterate (i, conditionFn, consumerFn, timeoutFn) {
        if (conditionFn(i)) {
            setTimeout(function () {
                consumerFn(i);
                timeoutIterate(i + 1, conditionFn, consumerFn, timeoutFn);
            }, timeoutFn(i));
        }
    }

    function timeout (i) {
        return data[i][timeoutIndex] * 1000;
    }

    function content (i) {
        return data[i][contentIndex];
    }

    function exists (i) {
        return i < data.length;
    }

    function consume (i) {
        document.write(content(i));
    }

}());
(函数(){
var contentIndex=0,timeoutIndex=1;
var data=JSON.parse(“”);
timeoutIterate(0,存在,消耗,超时);
函数timeoutIterate(i,conditionFn,consumerFn,timeoutFn){
如果(条件fn(i)){
setTimeout(函数(){
消费者网络(i);
timeoutIterate(i+1,条件fn,消费者fn,TimeOutn);
},timeoutn(i));
}
}
功能超时(i){
返回数据[i][timeoutIndex]*1000;
}
功能内容(一){
返回数据[i][contentIndex];
}
功能存在(i){
返回i
停下来想想为什么它们会同时启动。循环不会等待每个
设置超时执行,它会在几千分之一秒内运行。所以你需要不断添加延迟来错开启动时间,这是很公平的。但我真的更希望每个计时器在前一个计时器完成后启动。几个月前我是搜索这个:-/,伟大的问题:)+1来自我!是的!像这样,但我想把每次都与特定的文本联系起来。例如:((“彼得正在准备工作,20分钟),(“彼得在火车上,10分钟),(“彼得离开车站,步行去上班,5分钟))我想看看你的数组结构,你能给我看看你的$data数组的vardump输出吗“这只是一个动作列表和与每个动作相关的时间。我想在每个动作发生时显示它们。但这可能不是最好的方式。我不是javascript专家。我已经更新了我的答案,这是你想要的吗?
    var data =  [
    {"value":"this is first"},
    {"value":"this is second"},
    {"value":"this is third"},
    {"value":"this is forth"},
    {"value":"this is fifth"}
];

sequence_operate(data,0,500);

function sequence_operate(arr,index,interval){   
    setTimeout(function(){
        $("body").append("<div>"+arr[index].value);
        if(index<arr.length)
            sequence_operate(arr,index+1,interval);
    },interval);
}
(function () {

    var contentIndex = 0, timeoutIndex = 1;
    var data = JSON.parse('<?php echo json_encode($data); ?>');

    timeoutIterate(0, exists, consume, timeout);

    function timeoutIterate (i, conditionFn, consumerFn, timeoutFn) {
        if (conditionFn(i)) {
            setTimeout(function () {
                consumerFn(i);
                timeoutIterate(i + 1, conditionFn, consumerFn, timeoutFn);
            }, timeoutFn(i));
        }
    }

    function timeout (i) {
        return data[i][timeoutIndex] * 1000;
    }

    function content (i) {
        return data[i][contentIndex];
    }

    function exists (i) {
        return i < data.length;
    }

    function consume (i) {
        document.write(content(i));
    }

}());