Javascript 为什么可以';t/should';我是否使用while循环来监视异步jQuery操作?
我正试图集中精力协调异步操作。我需要一点帮助来理解:Javascript 为什么可以';t/should';我是否使用while循环来监视异步jQuery操作?,javascript,jquery,ajax,asynchronous,coordinate,Javascript,Jquery,Ajax,Asynchronous,Coordinate,我正试图集中精力协调异步操作。我需要一点帮助来理解: 为什么使用while循环等待操作完成是一个坏主意并且不起作用,以及 如果有对jQuery函数使用回调的可行替代方法 大多数情况下,向异步函数(如$.get())添加回调非常有效。然而,在某种程度上,这确实决定了我不喜欢的代码的编写方式和位置 $(function() { var r = AjaxResults( page ); // loop prevents further processing until GetRes
$(function() {
var r = AjaxResults( page );
// loop prevents further processing until GetResults() is done
while( isComplete == false )
isComplete = $('body').data('isComplete');
// reset isComplete boolean
$('body').data('isComplete', false);
// this will only continue after GetResults() has exited
paintTheTownRed();
var whateverElse = true;
});
function AjaxResults( page ) {
// do something before async operation
switch( page ){
case '1': {...} break;
...
default: break;
}
$.getJSON("/controller/page", null, function(data) {
// do something after async operation
{...}
$('body').data('isComplete', true);
return data;
});
}
因为它会占用我的CPU,让我非常恼火 您编写代码的地方几乎从不由异步/同步指定;函数是函数,无论它们是匿名的、以行方式编写的,还是作为引用命名和传递的 此外,承诺并帮助决定在何处/如何实现功能
查看类似的内容以了解更多细节和想法,但还有其他方法可以使用它们。因为这会占用我的CPU并使我非常恼火 您编写代码的地方几乎从不由异步/同步指定;函数是函数,无论它们是匿名的、以行方式编写的,还是作为引用命名和传递的 此外,承诺并帮助决定在何处/如何实现功能
查看其他细节和想法,但还有其他方法可以使用它们。简而言之,你不应该这样做,因为这将是一种非常糟糕的用户体验,会严重激怒大多数/所有观众。充其量,它会刺激CPU,不必要地耗尽观众的电池。最坏的情况是,观众会认为他们的浏览器冻结/挂起 由于javascript是单线程的,并且单线程性与浏览器中的用户事件处理有关,因此如果使用while循环来循环等待异步事件完成,则会在while循环期间锁定浏览器。您可能还会发现,某些浏览器会向用户发出有关javascript运行时间过长的警告 对于javascript中的异步编程,目前没有其他方法可以替代某些类型的回调。如果您想使用异步操作,那么您必须根据它们的工作方式调整编程风格,以保持良好的用户体验。是的,这意味着调整您的编程风格,但这是为了保持良好的用户体验而付出的代价。如果您想研究这一点,可以提供一种稍微更令人愉快的代码编写风格(仍然是回调,但似乎不那么令人愉快) 要做到你所建议的,就要在用户体验之前优先考虑你的编程便利性,这只是一个糟糕/懒惰的程序员的标志,他们的目标/优先权似乎颠倒了
仅供参考,这将是一种糟糕的编程实践,即使是在允许使用它的环境中(如本机Windows开发)。简而言之,您不应该这样做,因为这将是一种非常糟糕的用户体验,并且会严重激怒大多数/所有观众。充其量,它会刺激CPU,不必要地耗尽观众的电池。最坏的情况是,观众会认为他们的浏览器冻结/挂起 由于javascript是单线程的,并且单线程性与浏览器中的用户事件处理有关,因此如果使用while循环来循环等待异步事件完成,则会在while循环期间锁定浏览器。您可能还会发现,某些浏览器会向用户发出有关javascript运行时间过长的警告 对于javascript中的异步编程,目前没有其他方法可以替代某些类型的回调。如果您想使用异步操作,那么您必须根据它们的工作方式调整编程风格,以保持良好的用户体验。是的,这意味着调整您的编程风格,但这是为了保持良好的用户体验而付出的代价。如果您想研究这一点,可以提供一种稍微更令人愉快的代码编写风格(仍然是回调,但似乎不那么令人愉快) 要做到你所建议的,就要在用户体验之前优先考虑你的编程便利性,这只是一个糟糕/懒惰的程序员的标志,他们的目标/优先权似乎颠倒了 仅供参考,这将是一个糟糕的编程实践,即使是在允许使用它的环境中(如本机Windows开发) 大多数情况下,向异步函数(如
$.get()
)添加回调非常有效。然而,在某种程度上,这确实决定了我不喜欢的代码的编写方式和位置
不再需要直接向AJAX函数添加回调
使用jQuery可以在不需要过多嵌套的情况下,在需要的地方编写代码:
function AjaxResults( page ) {
... // prep
return $.getJSON("/controller/page", null)
.done(function(data) {
// always do this
});
}
AjaxResults(page).done(paintTheTownRed);
请务必将自己的complete
处理程序放在$.getJSON
上,如图所示,但通过返回jqXHR
对象,您就有机会执行额外的操作,而无需传递大量回调或嵌套代码
大多数情况下,向异步函数(如$.get()
)添加回调非常有效。然而,在某种程度上,这确实决定了我不喜欢的代码的编写方式和位置
不再需要直接向AJAX函数添加回调
使用jQuery可以在不需要过多嵌套的情况下,在需要的地方编写代码:
function AjaxResults( page ) {
... // prep
return $.getJSON("/controller/page", null)
.done(function(data) {
// always do this
});
}
AjaxResults(page).done(paintTheTownRed);
请务必将自己的
complete
处理程序放在$.getJSON
上,如图所示,但通过返回jqXHR
对象,您就有机会执行额外的操作,而无需传递大量回调或嵌套代码。如果您的问题是不喜欢定义在$.get()中调用的函数,然后尽可能将其作为单独的函数写入:
$(function() {
AjaxResults( page );
});
function AjaxResults( page ) {
// do something before async operation
switch( page ){
case '1': {...} break;
...
default: break;
}
$.getJSON("/controller/page", null, doWhatever);
}
function doWhatever(data) {
paintTheTownRed();
var whateverElse = true;
}
如果你的问题是你不喜欢定义