fix: Use promiseLimit

This commit is contained in:
lunya.pet 2025-06-30 17:42:30 +02:00
parent 04605283f9
commit 29c6bcd714
3 changed files with 38 additions and 54 deletions

View file

@ -49,8 +49,8 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts">
import type { SortOrder } from '@/components/MkSortOrderEditor.define.js';
import type { GridSortOrderKey } from './custom-emojis-manager.impl.js';
import type {SortOrder} from '@/components/MkSortOrderEditor.define.js';
import type {GridSortOrderKey} from './custom-emojis-manager.impl.js';
export type EmojiSearchQuery = {
name: string | null;
@ -91,6 +91,7 @@ import { selectFile } from '@/utility/select-file.js';
import { copyGridDataToClipboard, removeDataFromGrid } from '@/components/grid/grid-utils.js';
import { useLoading } from '@/components/hook/useLoading.js';
import { retryOnThrottled } from '@@/js/retry-on-throttled';
import promiseLimit from "promise-limit";
type GridItem = {
checked: boolean;
@ -355,11 +356,8 @@ async function onUpdateButtonClicked() {
};
const action = async (): Promise<ApiResponse[]> => {
const results: ApiResponse[] = [];
for (const item of updatedItems) {
results.push(await execute(item));
}
return results;
const limit = promiseLimit<ApiResponse>(2);
return await Promise.all(updatedItems.map(async it => limit(() => execute(it))));
};
const result = await os.promiseDialog(action());

View file

@ -74,34 +74,31 @@ SPDX-License-Identifier: AGPL-3.0-only
<script setup lang="ts">
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import * as Misskey from 'misskey-js';
import { onMounted, ref, useCssModule } from 'vue';
import { retryOnThrottled } from '@@/js/retry-on-throttled';
import type { RequestLogItem } from '@/pages/admin/custom-emojis-manager.impl.js';
import type { GridCellValidationEvent, GridCellValueChangeEvent, GridEvent } from '@/components/grid/grid-event.js';
import type { DroppedFile } from '@/utility/file-drop.js';
import type { GridSetting } from '@/components/grid/grid.js';
import type { GridRow } from '@/components/grid/row.js';
import { misskeyApi } from '@/utility/misskey-api.js';
import {
emptyStrToEmptyArray,
emptyStrToNull,
roleIdsParser,
} from '@/pages/admin/custom-emojis-manager.impl.js';
import {onMounted, ref, useCssModule} from 'vue';
import {retryOnThrottled} from '@@/js/retry-on-throttled';
import promiseLimit from 'promise-limit';
import type {RequestLogItem} from '@/pages/admin/custom-emojis-manager.impl.js';
import {emptyStrToEmptyArray, emptyStrToNull, roleIdsParser} from '@/pages/admin/custom-emojis-manager.impl.js';
import type {GridCellValidationEvent, GridCellValueChangeEvent, GridEvent} from '@/components/grid/grid-event.js';
import type {DroppedFile} from '@/utility/file-drop.js';
import {extractDroppedItems, flattenDroppedFiles} from '@/utility/file-drop.js';
import type {GridSetting} from '@/components/grid/grid.js';
import type {GridRow} from '@/components/grid/row.js';
import {misskeyApi} from '@/utility/misskey-api.js';
import MkGrid from '@/components/grid/MkGrid.vue';
import { i18n } from '@/i18n.js';
import {i18n} from '@/i18n.js';
import MkSelect from '@/components/MkSelect.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkFolder from '@/components/MkFolder.vue';
import MkButton from '@/components/MkButton.vue';
import * as os from '@/os.js';
import { validators } from '@/components/grid/cell-validators.js';
import { chooseFileFromDrive, chooseFileFromPc } from '@/utility/select-file.js';
import { uploadFile } from '@/utility/upload.js';
import { extractDroppedItems, flattenDroppedFiles } from '@/utility/file-drop.js';
import {validators} from '@/components/grid/cell-validators.js';
import {chooseFileFromDrive, chooseFileFromPc} from '@/utility/select-file.js';
import {uploadFile} from '@/utility/upload.js';
import XRegisterLogs from '@/pages/admin/custom-emojis-manager.logs.vue';
import { copyGridDataToClipboard } from '@/components/grid/grid-utils.js';
import {copyGridDataToClipboard} from '@/components/grid/grid-utils.js';
import { prefer } from '@/preferences.js';
import {prefer} from '@/preferences.js';
const MAXIMUM_EMOJI_REGISTER_COUNT = 100;
@ -275,12 +272,8 @@ const importEmojis = async (targets: any[]): Promise<void> => {
}
async function action(): Promise<ApiResponse[]> {
const results: ApiResponse[] = [];
for (const item of targets) {
results.push(await execute(item, 'admin/emoji/copy', { emojiId: item.id }));
}
return results;
const limit = promiseLimit<ApiResponse>(3);
return await Promise.all(targets.map(item => limit(() => execute(item, 'admin/emoji/copy', { emojiId: item.id }))));
}
const result = await os.promiseDialog(action());
@ -314,23 +307,17 @@ const onRegistryClicked = async (): Promise<void> => {
const items = gridItems.value.slice(0, MAXIMUM_EMOJI_REGISTER_COUNT);
async function action(): Promise<ApiResponse[]> {
const results: ApiResponse[] = [];
for (const item of items) {
results.push(
await execute(item, 'admin/emoji/add', {
name: item.name,
category: emptyStrToNull(item.category),
aliases: emptyStrToEmptyArray(item.aliases),
license: emptyStrToNull(item.license),
isSensitive: item.isSensitive,
localOnly: item.localOnly,
roleIdsThatCanBeUsedThisEmojiAsReaction: item.roleIdsThatCanBeUsedThisEmojiAsReaction.map((it: any) => it.id),
fileId: item.fileId!,
}),
);
}
return results;
const limit = promiseLimit<ApiResponse>(2);
return await Promise.all(items.map(item => limit(() => execute(item, 'admin/emoji/add', {
name: item.name,
category: emptyStrToNull(item.category),
aliases: emptyStrToEmptyArray(item.aliases),
license: emptyStrToNull(item.license),
isSensitive: item.isSensitive,
localOnly: item.localOnly,
roleIdsThatCanBeUsedThisEmojiAsReaction: item.roleIdsThatCanBeUsedThisEmojiAsReaction.map((it: any) => it.id),
fileId: item.fileId!,
}))));
}
const result = await os.promiseDialog(action());

View file

@ -161,6 +161,7 @@ import { deviceKind } from '@/utility/device-kind.js';
import MkPagingButtons from '@/components/MkPagingButtons.vue';
import MkSortOrderEditor from '@/components/MkSortOrderEditor.vue';
import { useLoading } from '@/components/hook/useLoading.js';
import promiseLimit from "promise-limit";
type GridItem = {
checked: boolean;
@ -339,10 +340,8 @@ const importEmojis = async (targets: any[]): Promise<void> => {
return;
}
const results: ApiResponse[] = [];
for (const item of targets) {
results.push(await execute(item));
}
const limit = promiseLimit<ApiResponse>(2);
const results = await Promise.all(targets.map(it => limit(() => execute(it))));
const failedItems = results.filter(it => !it.success);
if (failedItems.length > 0) {