必须使用 DelayedTask 否则 LoadMask 不显示

Having to use DelayedTask otherwise LoadMask doesn't show

我正在做一些需要时间的过程,所以我希望能够显示一个掩码,我使用 LoadMask。问题是我想要 运行 的代码似乎 运行 太快了,我想是在阻止 UI 显示掩码。这个过程大约需要 4 秒,所以我知道掩码不会同时启用和禁用。

我解决这个问题的方法是使用延迟任务,但感觉有点像代码味。

我可以换一种方式吗?

这是我的

    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);

效果很好,但我想知道这样做是否正确?

如果我删除 delayetaks,那么掩码似乎永远不会显示,但该过程确实有效。

假设您的 "process" 是某种本地顺序过程,您上面所说的几乎是正确的。如果您的代码 运行 是一个繁忙的循环,它不会放弃对 UI "thread" 的控制,以便浏览器重绘。

所以你不会在这里看到面具;

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

但如果你这样做:

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

它让浏览器有时间在您进入内容之前绘制。