迭代集合並對每個元素進行單獨的Ajax 呼叫時,必須控制順序以防止伺服器過載和瀏覽器凍結。雖然可以使用自訂迭代器,但還有更優雅的解決方案可用。
在jQuery 1.5 及更高版本中,$.ajaxQueue() 插件利用$ .Deferred、$.queue() 和$.ajax () 用於管理請求排序並提供在請求完成時解析的承諾。
var jqXHR, dfd = $.Deferred(), promise = dfd.promise(); ajaxQueue.queue( doRequest ); promise.abort = function( statusText ) { if ( jqXHR ) { return jqXHR.abort( statusText ); } var queue = ajaxQueue.queue(), index = $.inArray( doRequest, queue ); if ( index > -1 ) { queue.splice( index, 1 ); } dfd.rejectWith( ajaxOpts.context || ajaxOpts, [ promise, statusText, "" ] ); return promise; }; function doRequest( next ) { jqXHR = $.ajax( ajaxOpts ) .done( dfd.resolve ) .fail( dfd.reject ) .then( next, next ); } return promise;
};
})(jQuery);
]對於jQuery 1.4,動畫隊列可用於建立自訂「隊列」。您也可以建立自己的 $.ajaxQueue() 插件,該插件使用 jQuery 的「fx」佇列自動啟動佇列中的第一個請求(如果該請求尚未執行)。
var oldComplete = ajaxOpts.complete; ajaxQueue.queue(function(next) { ajaxOpts.complete = function() { if (oldComplete) oldComplete.apply(this, arguments); next(); }; $.ajax(ajaxOpts); });
};
})(jQuery);
url: '/echo/html/', data: {html : "[" idx "] " $(this).html()}, type: 'POST', success: function(data) { $("#output").append($("<li>", { html: data })); }
});
});
這可確保每個Ajax 請求按順序執行,從而可以優雅地處理伺服器負載並保持瀏覽器響應能力.
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3