У меня есть процесс, когда пользователь помещает в список через запятую, который затем обрабатывается по одному элементу за раз. Я хочу иметь возможность указать пользователю, что он обрабатывает, и сообщить ему, когда это будет сделано. Поэтому я использовал идею занавеса из повтора Боргара для ... Div Over Page .
Это сработало, но занавес исчезает задолго до завершения процесса. Я полагаю, что это потому, что каждый вызов в цикле forEach внутри функции importIDs вызывается асинхронно, возвращая управление обратно до его завершения. (Я знаю, что в этом и заключается идея асинхронного кода.) Так что же мне нужно сделать, чтобы держать занавес до тех пор, пока это не будет сделано?
HTML, который вызывает функцию
<label>Import list:</label><input style="width: 30em;" type="text" id="jcDelimitedList"/><input onclick="importIDs('jcDelimitedList','selectedJobCodes','AddJobCode');" type="button" value="Do It"/>
функция импорта
importIDs = function(dList,nodeId,actionName){
busyProcess(function(){
var ids = dojo.byId(dList).value;
dojo.forEach(ids.split(","),function(entry,i){doAssosiate(nodeId,actionName,null,dojo.byId(entry));});
});
};
которая вызывает функцию занятости
busyProcess = function(callback){
var ret;
var curtain = document.body.appendChild(document.createElement('div'));
curtain.id = "curtain";
curtain.onkeypress = curtain.onclick = function(){return false;};
try{
ret = callback();
}finally{
curtain.parentNode.removeChild(curtain);
}
return ret;
};
, который, в свою очередь, обрабатывает переданный цикл, вызывающий doAssosiate для каждого элемента в массиве:
doAssosiate = function(nodeID,actionName,evt,aNode){
if(aNode==null)return;
var node = dojo.byId(nodeID);
var newNode;
var target = evt!=null?evt.target:aNode;
newNode = dojo.clone(target);
var tID = target.id;
var sUrl = "action/groups." + actionName + "?id=" + tID + "&groupID=" + groupID + bustCache("&");
var get = getDefered(sUrl);
get.addCallback(function(data){
node.appendChild(newNode);
target.parentNode.removeChild(target);
return data;
});
get.addCallback(function(data){
dojo.behavior.apply();
return data;
});
};
, который запускает каждый URL с помощью getDefered
getDefered = function(url){
console.log(url);
return dojo.xhrGet({
url:url
});
};
Я думаю, что у меня есть весь соответствующий код выше. Я думал, что использование отправки цикла через занятый процесс будет удерживать до завершения, а затем возвращать вместо этого, пока оно не сработает до тех пор, пока не сработает каждая итерация, а затем вернется до завершения.
Как всегда, спасибо за любой вклад и критику.