0

我在使用此代码时遇到问题,我试图在函数运行时显示红色背景,然后(仅在那时)我将背景更改为绿色。

当下面的警报没有被评论时,我可以看到一会儿红色背景,然后是绿色(这就是我想要的)。

但是,当我评论该警报时,似乎从未设置过红色背景,并且一旦 processData 完成,背景就会正确设置为绿色。

有人可以为我解开这个谜吗?谢谢!

function beforeProcess(params){
    $('#result').css('background','red');
    alert('now i start waiting, while background is red');
    $.when(processData(params)).done(
        $('#result').css('background','green')
    );
}


function process(params){
     //This function takes some time, and it makes (indirectly) some synchronous ajax calls (async:false)
}
4

2 回答 2

0

视图仅在函数完成执行后更新。这可以使用 setTimeout http://jsfiddle.net/YEVHv/4/来完成

$('#result').css('background', 'red');
//alert('now i start waiting, while background is red');
setTimeout(function () {
    $.when(process("")).done(
    $('#result').css('background', 'green'));
}, 0);


function process(params) {
    for (var i = 0; i < 10000; i++) {
        console.log("hello");
    }
}

希望有帮助

于 2013-09-17T17:18:29.553 回答
0

我的猜测是你的函数“进程”返回得很快......请记住,JS 中的每个函数调用都是异步执行的。如果您想在处理过程中显示进度或显示某些状态(红色),则必须确保在所有子功能完成后函数进程返回。现在,我只能考虑使用标准回调。

$.when 在与延迟对象一起使用时很有用。如果您使用的函数不是延迟对象,则立即执行“完成”。请看一下“ http://api.jquery.com/jQuery.when/ ”的以下摘录:“如果将单个参数传递给 jQuery.when 并且它不是 Deferred 或 Promise,它将被视为已解决的 Deferred,并且附加的任何 doneCallbacks 都将立即执行。”

希望这可以帮助

于 2013-09-17T17:58:17.420 回答