停止延迟ajax调用

时间:2015-05-09 19:37:25

标签: jquery jquery-deferred deferred

我有一个函数可以从数据库获取一些信息并使用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未定义消息。

我没有想法,这是我第一次使用延期电话,所以我可能会遗漏一些明显的东西......

任何可以给我一些指导的人吗?

由于

2 个答案:

答案 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呼叫,然后不会发送其他呼叫。