mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Prevent MessageList multiple request at the same time #1071
This commit is contained in:
parent
fabc162481
commit
3a3b2f0771
4 changed files with 26 additions and 23 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 : ''),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue