我在这段代码中遇到了问题,我试图在函数工作时显示红色背景,然后(只有这样)我将背景更改为绿色。
当以下警报未被评论时,我可以看到一段时间的红色背景,然后是绿色(这就是我想要的)。
但是当我评论该警报时,似乎从未设置过红色背景,一旦 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)
}
只有在函数完成执行后,视图才会更新。这可以使用 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");
}
}
希望有帮助
我的猜测是你的函数"进程"返回得很快......请记住,JS中的每个函数调用都是异步执行的。如果要在处理时显示进度或显示某些状态(红色),则必须确保函数进程在所有子函数完成后返回。现在,我只能考虑使用标准回调。
$.when 在与延迟对象一起使用时很有用。如果您使用的函数不是延迟对象,则立即执行"done"。请看下面从"http://api.jquery.com/jQuery.when/"摘录:"如果将单个参数传递给jQuery.when,并且它不是延迟或承诺,它将被视为已解决的延迟,并且任何附加的doneCallbacks将立即执行。
希望这有帮助