2

CoreyFrangがajaxリクエストをキューに入れるためにstackoverflowに投稿した便利なプラグインがあります。私の場合、ユーザーが感じる速度の低下を最小限に抑えるために、「チャンク」に大量のデータのコレクションをロードするのに役立ちます。ajaxリクエストのキューが完了する前にページ付けイベントがトリガーされた場合を除いて、これは完全に機能します。この場合、ロードされたオブジェクトを保持しているコンテナはクリアされますが、キューに入れられたリクエストは引き続き実行され、望ましくない動作が発生します。私が欲しいのは、既存のすべてのリクエストのキューをクリアする方法を見つけて学ぶことです。開発者はこれを行う方法を投稿しましたが、機能していないようです。jQueryサイトの.queueを読んでみましたが、これを機能させる方法がわかりません。私はすでにこの問題を理解しようと多くの時間を費やしてきましたが、しかし、おそらくjQueryのより複雑な側面のいくつかに精通していないことが、私を妨げています。jQueryに精通している誰かが助けてくれることを願っています:)(提案されたものにマークを付け、いくつかの「!!!!!」では機能しないようです)

/*
* jQuery.ajaxQueue - A queue for ajax requests
* 
* (c) 2011 Corey Frang
* Dual licensed under the MIT and GPL licenses.
*
* Requires jQuery 1.5+
*/ 
(function($) {

// jQuery on an empty object, we are going to use this as our Queue
var ajaxQueue = $({});

$.ajaxQueue = function( ajaxOpts ) {
    var jqXHR,
        dfd = $.Deferred(),
        promise = dfd.promise();

    // queue our ajax request
    ajaxQueue.queue( doRequest );

    // add the abort method
    promise.abort = function( statusText ) {

        // proxy abort to the jqXHR if it is active
        if ( jqXHR ) {
            return jqXHR.abort( statusText );
        }

        // if there wasn't already a jqXHR we need to remove from queue
        var queue = ajaxQueue.queue(),
            index = $.inArray( doRequest, queue );

        if ( index > -1 ) {
            queue.splice( index, 1 );
        }

        // and then reject the deferred
        dfd.rejectWith( ajaxOpts.context || ajaxOpts,
            [ promise, statusText, "" ] );

        return promise;
    };

    // run the actual query
    function doRequest( next ) {        
        jqXHR = $.ajax( ajaxOpts )
            .then( next, next )
            .done( dfd.resolve )
            .fail( dfd.reject );
    }

    return promise;
};

// !!!!!!!!!!!!!!!!!
// this is what the developer suggested on his website in the comments section
// ... but it does not appear to work
$.ajaxQueue.stop = function( clear ) { ajaxQueue.stop( clear ); }

})(jQuery);
4

3 に答える 3

1

私が見たところ、問題は次のように思われます。

var ajaxQueue = $({});

ajaxQueueは単なる空のオブジェクトであり、オブジェクトの使用を停止するには、jQueryプラグインを指す必要があります

ajaxQueue.stop = function( clear ) { $.ajaxQueue.stop( clear ); }

、または単に使用します:

$.ajaxQueue.stop( clear );
于 2012-08-25T06:56:32.660 に答える
1

この関数をajaxQueueコードに追加しました。それは効率的ではないかもしれませんが、キューをクリアすることによって仕事をします:

if (ajaxOpts=='clear'){
    ajaxQueue.clearQueue();
    return promise;
}
于 2012-09-26T06:43:40.450 に答える
1

私が問題を解決するのを手伝ってくれてありがとう。でも..

より良いajaxキュープラグインを見つけました-OlegPodolskyによる「ajaxq」。ajaxリクエストをキューに入れる必要がある場合(キューを適切にクリアする機能とともに)、代わりにこれを使用することをお勧めします。

キューに追加する:

ajaxq('queue_name', {
    // standard $.ajax options
});

キューの停止/クリア:

ajaxq('queue_name');

プラグイン:

/*
 * jQuery AjaxQ - AJAX request queueing for jQuery
 *
 * Version: 0.0.1
 * Date: July 22, 2008
 *
 * Copyright (c) 2008 Oleg Podolsky (oleg.podolsky@gmail.com)
 * Licensed under the MIT (MIT-LICENSE.txt) license.
 *
 * http://plugins.jquery.com/project/ajaxq
 * http://code.google.com/p/jquery-ajaxq/
 */

jQuery.ajaxq = function (queue, options)
{
    // Initialize storage for request queues if it's not initialized yet
    if (typeof document.ajaxq == "undefined") document.ajaxq = {q:{}, r:null};

    // Initialize current queue if it's not initialized yet
    if (typeof document.ajaxq.q[queue] == "undefined") document.ajaxq.q[queue] = [];

    if (typeof options != "undefined") // Request settings are given, enqueue the new request
    {
        // Copy the original options, because options.complete is going to be overridden

        var optionsCopy = {};
        for (var o in options) optionsCopy[o] = options[o];
        options = optionsCopy;

        // Override the original callback

        var originalCompleteCallback = options.complete;

        options.complete = function (request, status)
        {
            // Dequeue the current request
            document.ajaxq.q[queue].shift ();
            document.ajaxq.r = null;

            // Run the original callback
            if (originalCompleteCallback) originalCompleteCallback (request, status);

            // Run the next request from the queue
            if (document.ajaxq.q[queue].length > 0) document.ajaxq.r = jQuery.ajax (document.ajaxq.q[queue][0]);
        };

        // Enqueue the request
        document.ajaxq.q[queue].push (options);

        // Also, if no request is currently running, start it
        if (document.ajaxq.q[queue].length == 1) document.ajaxq.r = jQuery.ajax (options);
    }
    else // No request settings are given, stop current request and clear the queue
    {
        if (document.ajaxq.r)
        {
            document.ajaxq.r.abort ();
            document.ajaxq.r = null;
        }

        document.ajaxq.q[queue] = [];
    }
}
于 2012-10-09T12:06:35.403 に答える