我需要为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
函数是相同的;