diff --git src/wp-admin/js/edit-comments.js src/wp-admin/js/edit-comments.js
index b9a9f2cf85..ac93db20c9 100644
--- src/wp-admin/js/edit-comments.js
+++ src/wp-admin/js/edit-comments.js
@@ -288,6 +288,11 @@ setCommentsList = function() {
 			$('.avatar', el).first().clone().prependTo('#undo-' + id + ' .' + action + '-undo-inside');
 
 			a.click(function( e ){
+
+				// Abort undo if there is an unfinished AJAX request involving the same comment.
+				if ( wpList.xhrs.inProgress( 'comment-' + id ) ) {
+					return false;
+				}
 				e.preventDefault();
 				e.stopPropagation(); // ticket #35904
 				list.wpList.del(this);
diff --git src/wp-includes/js/wp-lists.js src/wp-includes/js/wp-lists.js
index c73471dbcb..9877c5baf6 100644
--- src/wp-includes/js/wp-lists.js
+++ src/wp-includes/js/wp-lists.js
@@ -187,6 +187,12 @@ wpList = {
 		dimAfter: null
 	},
 
+	/**
+	 * Track XHR connections.
+	 * @type {Object}
+	 */
+	xhrs: wp.xhrs(),
+
 	/**
 	 * Finds a nonce.
 	 *
@@ -384,9 +390,10 @@ wpList = {
 					parsed: parsedResponse
 				}, settings ) );
 			}
+			wpList.xhrs.clear();
 		};
 
-		$.ajax( settings );
+		wpList.xhrs.setXhrs( settings.element, $.ajax( settings ) );
 
 		return false;
 	},
@@ -410,6 +417,11 @@ wpList = {
 		settings.element  = data[2] || settings.element || null;
 		settings.delColor = data[3] ? '#' + data[3] : settings.delColor;
 
+		// Return if there is already an AJAX request in progress involving the same element.
+		if ( wpList.xhrs.inProgress( settings.element ) ) {
+			return false;
+		}
+
 		if ( ! settings || ! settings.element ) {
 			return false;
 		}
@@ -473,7 +485,7 @@ wpList = {
 			}
 		};
 
-		$.ajax( settings );
+		wpList.xhrs.setXhrs( settings.element, $.ajax( settings ) );
 
 		return false;
 	},
@@ -504,6 +516,11 @@ wpList = {
 		settings.dimAddColor = data[4] ? '#' + data[4] : settings.dimAddColor;
 		settings.dimDelColor = data[5] ? '#' + data[5] : settings.dimDelColor;
 
+		// Return if there is already an AJAX request in progress involving the same element.
+		if ( wpList.xhrs.inProgress( settings.element ) ) {
+			return false;
+		}
+
 		if ( ! settings || ! settings.element || ! settings.dimClass ) {
 			return true;
 		}
@@ -587,6 +604,10 @@ wpList = {
 		};
 
 		settings.complete = function( jqXHR, status ) {
+
+			// Clear all finished AJAX requests from xhrs object.
+			wpList.xhrs.clear();
+
 			if ( $.isFunction( settings.dimAfter ) ) {
 				$eventTarget.queue( function() {
 					settings.dimAfter( returnedResponse, $.extend( {
@@ -598,7 +619,7 @@ wpList = {
 			}
 		};
 
-		$.ajax( settings );
+		wpList.xhrs.setXhrs( settings.element, $.ajax( settings ) );
 
 		return false;
 	},
@@ -836,7 +857,7 @@ wpList = {
 $.fn.wpList = function( settings ) {
 	this.each( function( index, list ) {
 		list.wpList = {
-			settings: $.extend( {}, wpList.settings, { what: wpList.parseData( list, 'list' )[1] || '' }, settings )
+			settings: $.extend( {}, wpList.settings, { what: wpList.parseData( list, 'list' )[1] || '' }, { xhrs: wpList.xhrs }, settings )
 		};
 
 		$.each( functions, function( func, callback ) {
diff --git src/wp-includes/js/xhrs.js src/wp-includes/js/xhrs.js
new file mode 100644
index 0000000000..fb37c48ec9
--- /dev/null
+++ src/wp-includes/js/xhrs.js
@@ -0,0 +1,40 @@
+( function() {
+	var wp = window.wp || {};
+
+	/**
+	 * Track XHR requests in progress.
+	 */
+	wp.xhrs = function() {
+		return {
+			xhrs: {},
+
+			// Clear all tracked xhrs.
+			clear: function() {
+
+				// Clear all finished AJAX requests from xhrs object.
+				if ( 'undefined' !== typeof this.xhrs ) {
+					for ( var key in this.xhrs ) {
+						if ( 4 === this.xhrs[ key ].readyState ) {
+							delete this.xhrs[ key ];
+						}
+					}
+				}
+
+			},
+
+			// Does the element in question have a request in progress?
+			inProgress: function( element ) {
+				return (
+					this.xhrs &&
+					'undefined' !== typeof this.xhrs[ element ] &&
+					4 !== this.xhrs[ element ].readyState
+				);
+			},
+
+			// Set up xhr record for an element.
+			setXhrs: function( element, xhr ) {
+				this.xhrs[ element ] = xhr;
+			}
+		}
+	}
+} ) ();
diff --git src/wp-includes/script-loader.php src/wp-includes/script-loader.php
index 8989cf0ce3..9f6df670f9 100644
--- src/wp-includes/script-loader.php
+++ src/wp-includes/script-loader.php
@@ -175,7 +175,8 @@ function wp_default_scripts( &$scripts ) {
 		'interval' => apply_filters( 'wp_auth_check_interval', 3 * MINUTE_IN_SECONDS ),
 	) );
 
-	$scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array( 'wp-ajax-response', 'jquery-color' ), false, 1 );
+	$scripts->add( 'xhrs', "/wp-includes/js/xhrs$suffix.js", array(), false, 1 );
+	$scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array( 'wp-ajax-response', 'jquery-color', 'xhrs' ), false, 1 );
 
 	// WordPress no longer uses or bundles Prototype or script.aculo.us. These are now pulled from an external source.
 	$scripts->add( 'prototype', 'https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js', array(), '1.7.1');
@@ -636,7 +637,7 @@ function wp_default_scripts( &$scripts ) {
 			'broken' => __('An unidentified error has occurred.')
 		));
 
-		$scripts->add( 'admin-comments', "/wp-admin/js/edit-comments$suffix.js", array('wp-lists', 'quicktags', 'jquery-query'), false, 1 );
+		$scripts->add( 'admin-comments', "/wp-admin/js/edit-comments$suffix.js", array( 'wp-lists', 'quicktags', 'jquery-query', 'xhrs' ), false, 1 );
 		did_action( 'init' ) && $scripts->localize( 'admin-comments', 'adminCommentsL10n', array(
 			'hotkeys_highlight_first' => isset($_GET['hotkeys_highlight_first']),
 			'hotkeys_highlight_last' => isset($_GET['hotkeys_highlight_last']),
