fix(ui/browser): send del requests in batch

This commit is contained in:
hexxa 2021-08-27 17:53:23 +08:00 committed by Hexxa
parent dcf871f1ff
commit 85be9fe67d

View file

@ -11,6 +11,7 @@ import {
MetadataResp, MetadataResp,
UploadInfo, UploadInfo,
Quota, Quota,
Response,
} from "../client"; } from "../client";
import { FilesClient } from "../client/files"; import { FilesClient } from "../client/files";
import { UsersClient } from "../client/users"; import { UsersClient } from "../client/users";
@ -129,22 +130,43 @@ export class Updater {
items: List<MetadataResp>, items: List<MetadataResp>,
selectedItems: Map<string, boolean> selectedItems: Map<string, boolean>
): Promise<void> => { ): Promise<void> => {
const delRequests = items const pathsToDel = items
.filter((item) => { .filter((item) => {
return selectedItems.has(item.name); return selectedItems.has(item.name);
}) })
.map(async (selectedItem: MetadataResp): Promise<string> => { .map((selectedItem: MetadataResp): string => {
const itemPath = getItemPath(dirParts.join("/"), selectedItem.name); return getItemPath(dirParts.join("/"), selectedItem.name);
const resp = await this.filesClient.delete(itemPath); // const resp = await this.filesClient.delete(itemPath);
return resp.status === 200 ? "" : selectedItem.name; // return resp.status === 200 ? "" : selectedItem.name;
}); });
const failedFiles = await Promise.all(delRequests); const batchSize = 5;
failedFiles.forEach((failedFile) => { let batch = List<string>();
if (failedFile !== "") { let fails = List<string>();
alertMsg(`failed to delete ${failedFile}`);
for (let i = 0; i < pathsToDel.size; i++) {
batch = batch.push(pathsToDel.get(i));
if (batch.size >= batchSize || i == pathsToDel.size - 1) {
let promises = batch.map(async (itemPath): Promise<Response<any>> => {
return this.filesClient.delete(itemPath);
});
const resps = await Promise.all(promises.toSeq());
resps.forEach((resp: Response<any>, i: number) => {
if (resp.status !== 200) {
fails = fails.push(batch.get(i));
} }
}); });
batch = batch.clear();
}
}
if (fails.size > 0) {
alertMsg(`failed to delete ${fails.join(",\n")}`);
}
return this.setItems(dirParts); return this.setItems(dirParts);
}; };