JavaScript:如何为setInterval函数设置自定义行为

时间:2014-03-24 07:42:38

标签: javascript php jquery setinterval

我需要为setInterval js函数设置自定义行为;

这是在线游戏的一部分,此脚本用于保持数据更新;

worlds[world_id].building是红绿灯,grren为true,红色值为false,只是为了知道;

我使用以下函数来获取数组;

这是js函数:

function init() {
        $.ajax({
            type: "POST",
            url: '<?php echo Yii::app()->baseUrl; ?>/robots/default/loadWorlds',
            data: {},
            success: function(data) {
                if (data) {
                    if (data.status === true) {
                        if (data.worlds) {
                            worlds = data.worlds;
                            $.each(data.worlds, function(key, value) {
                                addElement(key, value);
                                count_world_ids++;
                            });
                        }
                    }
                }
            },
            dataType: 'json',
        });
    }

js函数调用此php方法:

public function actionLoadWorlds() {
        $worlds = array();
        $status = true;
        $result = array(
            'worlds' => &$worlds,
            'status' => &$status,
        );
        $model_worlds = WorldM::model()->findAllByAttributes(array('status' => WorldM::ACTIVE));
        if ($model_worlds) {
            $ind = 0;
            foreach ($model_worlds as $key => $model_world) {
                $ind++;
                $worlds[$ind] = array(
                    'id' => $model_world->id,
                    'battle' => true,
                    'building' => true,
                    'troop' => true,
                    'resources' => true,
                );
            }
        } else {
            $status = false;
        }
        echo json_encode($result);
        exit;
    }

现在我已经获得了我的数组,我可以在each函数中看到js,并调用addElement js函数;

addElement js函数中,在插入所需的所有div元素后,我将调用此js函数:

   setInterval(function() {
    fBattle(value['id']);
}, 1000);

setInterval(function() {
    fBuilding(value['id']);
}, 1000);

setInterval(function() {
    fTroop(value['id']);
}, 1000);

setInterval(function() {
    fVillageResources(value['id']);
}, 1000);

因此,对于每个世界,这些功能将以1秒的间隔触发;

如果我有10个世界,fBattle(value['id']);将被触发10次;

现在,问题出现了:

为什么fBattle同时触发所有世界?

它有一个不同的参数,从1到...... n世界;

此外,在fBattle功能中有一个红绿灯,如果作业没有完成,则不应该触发;

此过程应为async,因为在不同的世界中,作业可能无法完成;

function fBattle(world_id) {
        if (worlds[world_id].battle == true) {
            worlds[world_id].battle = false;
            document.getElementById('battlePermission' + world_id).innerText = 'working';
            $.ajax({
                type: "POST",
                url: '<?php echo Yii::app()->baseUrl; ?>/robots/battle/test',
                data: {},
                success: function(data) {
                    console.log('battle ' + world_id);
                    console.log(data);
                    worlds[world_id].battle = true;
                    document.getElementById('battlePermission' + world_id).innerText = 'finished';
                },
                dataType: 'json',
            });
        }
    }

现在,这是每项行动的工作:

public function actionTest() {
        $sleep = rand(1, 10);
        sleep($sleep);
        echo json_encode(array('result' => true, 'sleep' => $sleep));
        exit;
    }

我知道此操作会在同一时间针对所有世界触发,并且rand值对于相同的js函数是相同的;

0 个答案:

没有答案