0
Voltooid

SetTimeout/SetInterval и параметры

AlexDr 7 jaar geleden in iRidium Script bijgewerkt door Oksana (expert) 7 jaar geleden 8

В JS есть возможность передать параметры анонимной функции используемой в процедурах setInterval и setTimeout:


var hello = "Hello World";

setTimeout(alert, 1000, hello);


В аналогичных функциях иридиум скрипт эта возможность не реализована. Предлагаю добавить ее в API. Меньше бы изврата пришлось городить в коде...

или более наглядно код в JS


var hello = "Hello World";

setTimeout(function(param){

alert(param);

}, 1000, hello);

Очень сложно отловить вашу мысль:) Расскажите пожалуйста какой смысл вы несете. Как и для чего это необходимо использовать? Пример не блещет необходимостью! О каком "изврате" в коде вы говорите.


Спасибо.

ок, опишу конкретную задачу: надо с определенными интервалами вызывать процедуру

//есть массив
var Valves =[ //перечень каналов управления вентилями
{name: "ВВ1", fullName:HDL16chRelay+"BB1", TimeOut:1},
{name: "ВВ2", fullName:HDL16chRelay+"BB2", TimeOut:RotateTime*2.5},
{name: "ВВ3+ВВ4", fullName:HDL16chRelay+"BB3_BB4", TimeOut:RotateTime*4.5},
{name: "ВВ5+ВВ6", fullName:HDL16chRelay+"BB5_BB6", TimeOut:RotateTime*6.5},
{name: "ВВ7+ВВ8", fullName:HDL16chRelay+"BB7_BB8", TimeOut:RotateTime*8.5},
];
//как бы вы оптимизировали следующий код?
IR.SetTimeout(Valves[0].TimeOut*1000, function(){_RotateValveChanel(Valves[0]);});
IR.SetTimeout(Valves[1].TimeOut*1000, function(){_RotateValveChanel(Valves[1]);});
IR.SetTimeout(Valves[2].TimeOut*1000, function(){_RotateValveChanel(Valves[2]);});
IR.SetTimeout(Valves[3].TimeOut*1000, function(){_RotateValveChanel(Valves[3]);});
IR.SetTimeout(Valves[4].TimeOut*1000, function(){_RotateValveChanel(Valves[4]);});
//=================================

я хотел сделать циклом:
for(i=0; i<Valves.length; i++){
IR.SetTimeout(Valves[i].TimeOut*1000, _RotateValveChanel(Valves[i]));
}
function _RotateValveChanel(Valve){
debug("=====> Обслуживание вентиля(ей) "+Valve.name);
HDLdeviceON(Valve.fullName); //закрываем вентиль
}

но в логе увидел что все пять процедур вызываются одна за другой с интервалом пару мс
Если бы была возможность передать в анонимную функцию параметр, то код в цикле работал

for(i=0; i<Valves.length; i++){
IR.SetTimeout(Valves[i].TimeOut*1000, function(idx){_RotateValveChanel(Valves[idx]);}, i); //как то так...

}

it's magic!)

Супер! Спасибо)

Наздоровье. Может и более крачиво можно реализовать, но работает

На здоровье. Может и более красиво можно реализовать, но работает