Завеса javascript (используется для обозначения занятого процесса) не отображается для всего процесса. Probaly я не понимаю, обратный вызов будет достаточно - PullRequest
1 голос
/ 09 марта 2010

У меня есть процесс, когда пользователь помещает в список через запятую, который затем обрабатывается по одному элементу за раз. Я хочу иметь возможность указать пользователю, что он обрабатывает, и сообщить ему, когда это будет сделано. Поэтому я использовал идею занавеса из повтора Боргара для ... 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
});

};

Я думаю, что у меня есть весь соответствующий код выше. Я думал, что использование отправки цикла через занятый процесс будет удерживать до завершения, а затем возвращать вместо этого, пока оно не сработает до тех пор, пока не сработает каждая итерация, а затем вернется до завершения.

Как всегда, спасибо за любой вклад и критику.

1 Ответ

0 голосов
/ 09 марта 2010

Пара интересных ошибок в выше. В основном, если список идентификаторов в массиве слишком велик, он генерирует больше трафика в базе данных, чем может обрабатывать. Поэтому я пошел к рекурсивной функции вместо цикла foreach. Затем снял с себя ответственность за отключение шторки от функции busyProcess и добавил ее к рекурсивному вызову, который выключал шторку при выходе из рекурсии. Для тех, кому небезразлично ниже, есть измененные функции. Также измените использование dojox.widget.Standby для занавеса.

    busyProcess = function(callback){
    var ret;
    document.body.appendChild(standby.domNode);
    standby.show();
    ret = callback();

    return ret;
};

вместо вызова doAssosiate теперь он вызывает assosiateAll;

    importIDs = function(dList,nodeId,actionName){
    busyProcess(function(){
        var ids = dojo.byId(dList).value;
        var sourceNode = dojo.byId(nodeId);
        assosiateAll(ids.split(","),0,sourceNode,actionName);
    });
};




    assosiateAll = function(idArray,idx,sourceNode,actionName){
    if(idx <= idArray.length ){
        var target = dojo.byId(idArray[idx]);
        if(target == null){
            idx++;
            assosiateAll(idArray,idx,sourceNode,actionName);
        }else{
            var 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){
                sourceNode.appendChild(newNode);
                target.parentNode.removeChild(target);
                return data;                    
            });
            get.addCallback(function(data){
                idx++;
                assosiateAll(idArray,idx,sourceNode,actionName);
                return data;
            });
            get.addCallback(function(data){
                dojo.behavior.apply();
                if (idx == (idArray.length -1)) {
                    standby.hide();
                }
                return data;
            });
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...