2015-10-09 4 views
0

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

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

Кто-нибудь еще делает это по-другому?

Вот что у меня есть

var myMask = new Ext.LoadMask(win, {}); 
    myMask.show(); 

    var task = new Ext.util.DelayedTask(function() { 

     ....... // DO MY stuff and eventually do a myMask.hide() 

    task.delay(400); 

Он отлично работает, но мне было интересно, если это правильный путь?

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

Заранее спасибо

+0

Можете вы добавить код для своей задачи, включая myMask.hide()? – forgivenson

+0

Ваша задача в 4 секунды? Вызов метода REST? – Mattex83

+0

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

ответ

2

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

Таким образом, вы не увидите маску здесь;

mask(); 
busyLoop(); 
unmask(); 

Но если вы делаете:

mask(); 
setTimeout(function() { 
    busyLoop(); 
    unmask(); 
}, 1); 

Это дает время браузер рисовать, прежде чем попасть в ваши вещи.