Prevent MessageList multiple request at the same time #1071

This commit is contained in:
the-djmaze 2023-06-12 17:00:23 +02:00
parent fabc162481
commit 3a3b2f0771
4 changed files with 26 additions and 23 deletions

View file

@ -217,7 +217,7 @@ messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => {
isSpam = sSpamFolder === toFolderFullName, isSpam = sSpamFolder === toFolderFullName,
isHam = !isSpam && sSpamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName; isHam = !isSpam && sSpamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName;
Remote.abort('MessageList').request('MessageMove', Remote.abort('MessageList', 'reload').request('MessageMove',
moveOrDeleteResponseHelper, moveOrDeleteResponseHelper,
{ {
fromFolder: fromFolderFullName, fromFolder: fromFolderFullName,
@ -230,7 +230,7 @@ messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => {
}, },
messagesDeleteHelper = (sFromFolderFullName, aUidForRemove) => { messagesDeleteHelper = (sFromFolderFullName, aUidForRemove) => {
Remote.abort('MessageList').request('MessageDelete', Remote.abort('MessageList', 'reload').request('MessageDelete',
moveOrDeleteResponseHelper, moveOrDeleteResponseHelper,
{ {
folder: sFromFolderFullName, folder: sFromFolderFullName,

View file

@ -32,10 +32,11 @@ checkResponseError = data => {
oRequests = {}, oRequests = {},
abort = (sAction, sReason, bClearOnly) => { abort = (sAction, sReason, bClearOnly) => {
if (oRequests[sAction]) { let controller = oRequests[sAction];
bClearOnly || oRequests[sAction].abort(sReason || 'AbortError'); oRequests[sAction] = null;
oRequests[sAction] = null; if (controller) {
delete oRequests[sAction]; clearTimeout(controller.timeoutId);
bClearOnly || controller.abort(sReason || 'AbortError');
} }
}, },
@ -48,13 +49,17 @@ fetchJSON = (action, sUrl, params, timeout, jsonCallback) => {
} }
} }
// Don't abort, read https://github.com/the-djmaze/snappymail/issues/487 // Don't abort, read https://github.com/the-djmaze/snappymail/issues/487
// abort(action); // abort(action, 0, 1);
const controller = new AbortController(), const controller = new AbortController(),
signal = controller.signal; signal = controller.signal;
oRequests[action] = controller; oRequests[action] = controller;
// Currently there is no way to combine multiple signals, so AbortSignal.timeout() not possible // Currently there is no way to combine multiple signals, so AbortSignal.timeout() not possible
timeout && setTimeout(() => abort(action, 'TimeoutError'), timeout); controller.timeoutId = timeout && setTimeout(() => abort(action, 'TimeoutError'), timeout);
return rl.fetchJSON(sUrl, {signal: signal}, params).then(jsonCallback).catch(err => { return rl.fetchJSON(sUrl, {signal: signal}, params).then(data => {
abort(action, 0, 1);
return jsonCallback(data);
}).catch(err => {
clearTimeout(controller.timeoutId);
err.aborted = signal.aborted; err.aborted = signal.aborted;
err.reason = signal.reason; err.reason = signal.reason;
return Promise.reject(err); return Promise.reject(err);
@ -71,8 +76,8 @@ class FetchError extends Error
export class AbstractFetchRemote export class AbstractFetchRemote
{ {
abort(sAction) { abort(sAction, sReason) {
abort(sAction); abort(sAction, sReason);
return this; return this;
} }
@ -131,11 +136,7 @@ export class AbstractFetchRemote
undefined === iTimeout ? 30000 : pInt(iTimeout), undefined === iTimeout ? 30000 : pInt(iTimeout),
data => { data => {
let iError = 0; let iError = 0;
if (sAction && oRequests[sAction]) { if (data) {
abort(sAction, 0, 1);
}
if (!iError && data) {
/* /*
if (sAction !== data.Action) { if (sAction !== data.Action) {
console.log(sAction + ' !== ' + data.Action); console.log(sAction + ' !== ' + data.Action);

View file

@ -20,7 +20,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
* @param {object} params * @param {object} params
* @param {boolean=} bSilent = false * @param {boolean=} bSilent = false
*/ */
messageList(fCallback, params, bSilent = false) { messageList(fCallback, params) {
const const
// folder = getFolderFromCacheList(params.folder.fullName), // folder = getFolderFromCacheList(params.folder.fullName),
folder = getFolderFromCacheList(params.folder), folder = getFolderFromCacheList(params.folder),
@ -46,8 +46,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
params = {}; params = {};
} }
bSilent || this.abort('MessageList'); this.abort('MessageList', 'reload').request('MessageList',
this.request('MessageList',
fCallback, fCallback,
params, params,
60000, // 60 seconds before aborting 60000, // 60 seconds before aborting

View file

@ -196,10 +196,13 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrentFolderCach
(iError, oData, bCached) => { (iError, oData, bCached) => {
let error = ''; let error = '';
if (iError) { if (iError) {
error = getNotification(iError); if ('reload' != oData?.reason) {
if (Notifications.RequestAborted !== iError) { error = getNotification(iError);
MessagelistUserStore([]); MessagelistUserStore.loading(false);
} }
// if (Notifications.RequestAborted !== iError) {
// MessagelistUserStore([]);
// }
// if (oData.message) { error = oData.message + error; } // if (oData.message) { error = oData.message + error; }
// if (oData.reason) { error = oData.reason + " " + error; } // if (oData.reason) { error = oData.reason + " " + error; }
} else { } else {
@ -278,9 +281,9 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrentFolderCach
MessagelistUserStore([]); MessagelistUserStore([]);
error = getNotification(Notifications.CantGetMessageList); error = getNotification(Notifications.CantGetMessageList);
} }
MessagelistUserStore.loading(false);
} }
MessagelistUserStore.error(error); MessagelistUserStore.error(error);
MessagelistUserStore.loading(false);
}, },
{ {
// folder: FolderUserStore.currentFolder() ? self.currentFolder().fullName : ''), // folder: FolderUserStore.currentFolder() ? self.currentFolder().fullName : ''),