我有一个函数可以从数据库获取一些信息并使用PHP执行一些逻辑,这使得这个过程在数据库中的每个结果中花费5到10秒 - 有时整个过程需要5分钟总
我知道所有进程何时完成的唯一方法是使用jQuery延迟调用,因为它全部异步运行,但有时用户可能希望停止此过程并使用不同的参数重新开始。
我已经搜索了如何停止这些调用,但无法找到任何内容,我读到了$ deferObj.reject(),但它不适合我,我得到 $ deferObj.reject不是一个功能
基本上我想要做的就是开始这个过程,当我点击停止按钮然后延迟调用停止。现在这种情况没有发生,让我离开那里甚至刷新重新开始,其余的延期通话结束需要一些时间。
这是启动延期通话的代码:
var getBooks = function( title ) {
return $.ajax({
url: 'ajax-handler.php',
data: {action: 'get_books', title: title, params: $( '#params' ).val()},
method: 'POST',
dataType: 'json',
success: function( results ) {
if ( results.error ) {
console.log( 'Got an error processing ' + title );
}
}
});
}
var books = new Array( 'Book 1', 'Book 2', 'Book 3', 'Book4' );
var defBooks = new Array();
for ( var i = 0; i < books.length; i++ ) {
defBooks.push( getBooks( books[ i ] ) );
}
deferBooks = $.when.apply( $, defBooks );
deferBooks.done( function() {
alert( 'Process finished correctly' );
}).fail( function () {
alert( 'Process failed' );
});
这段代码运行得很好,当我遇到网络问题或者我的PHP代码出错时,我只收到进程失败消息,因此需要在后端完成所有操作
现在,我还有一个停止处理按钮,它应该停止所有执行并让我重新开始,这里是该按钮的代码&#39;点击事件:
$( document ).on( 'click', '#stop-button', function() {
deferBooks.reject(); // this one gives me the **deferBooks.reject is not a function** error message in the console
});
请注意,deferBooks变量我已经尝试在我的脚本文件的最顶部声明它,以便它可以在所有功能中使用,这就是为什么我没有得到 deferBooks未定义消息。
我没有想法,这是我第一次使用延期电话,所以我可能会遗漏一些明显的东西......
任何可以给我一些指导的人吗?
由于
答案 0 :(得分:0)
发送AJAX请求后,您无法阻止其被处理。最接近的类比就是试图在它被解雇后试图阻止它。
我最好不要使用同步调用吗?
不,永远不要使用同步调用。他们的做法非常糟糕。至于停止按钮,你可以做任何事情都没有。您可以重新启用在请求运行时禁用的任何按钮,但服务器仍将处理请求。用户界面根本不会在收到回报时听取回报。
答案 1 :(得分:0)
jQuery ajax调用返回组合promise和jQuery ajax对象。除了promise方法,它还有一个.abort()
方法。这将“取消”ajax调用并导致承诺被拒绝。
取消已经发送到服务器的ajax调用可能实际上对您的服务器没有任何影响,因为服务器上的请求可能已经在进行(详细信息取决于您的服务器实现以及实际请求的数量)正在进行中)。但是,它确实阻止了您的成功处理程序处理结果。
由于你在defBooks中拥有所有jQuery ajax对象,你可以这样做:
// to cancel, you could do this:
defBooks.forEach(function(item) {
item.abort();
});
相关答案:
Abort Ajax requests using jQuery
How to cancel/abort jQuery AJAX request?
如果您希望对服务器上的取消进行更精细的控制,那么您必须更改发送ajax调用的方式,这样您就不会立即发送它们。相反,你会依次对它们进行排序。然后,您可以中止当前正在播放的ajax呼叫,然后不会发送其他呼叫。