fix: Use promiseLimit
This commit is contained in:
parent
04605283f9
commit
29c6bcd714
3 changed files with 38 additions and 54 deletions
|
|
@ -49,8 +49,8 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { SortOrder } from '@/components/MkSortOrderEditor.define.js';
|
import type {SortOrder} from '@/components/MkSortOrderEditor.define.js';
|
||||||
import type { GridSortOrderKey } from './custom-emojis-manager.impl.js';
|
import type {GridSortOrderKey} from './custom-emojis-manager.impl.js';
|
||||||
|
|
||||||
export type EmojiSearchQuery = {
|
export type EmojiSearchQuery = {
|
||||||
name: string | null;
|
name: string | null;
|
||||||
|
|
@ -91,6 +91,7 @@ import { selectFile } from '@/utility/select-file.js';
|
||||||
import { copyGridDataToClipboard, removeDataFromGrid } from '@/components/grid/grid-utils.js';
|
import { copyGridDataToClipboard, removeDataFromGrid } from '@/components/grid/grid-utils.js';
|
||||||
import { useLoading } from '@/components/hook/useLoading.js';
|
import { useLoading } from '@/components/hook/useLoading.js';
|
||||||
import { retryOnThrottled } from '@@/js/retry-on-throttled';
|
import { retryOnThrottled } from '@@/js/retry-on-throttled';
|
||||||
|
import promiseLimit from "promise-limit";
|
||||||
|
|
||||||
type GridItem = {
|
type GridItem = {
|
||||||
checked: boolean;
|
checked: boolean;
|
||||||
|
|
@ -355,11 +356,8 @@ async function onUpdateButtonClicked() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const action = async (): Promise<ApiResponse[]> => {
|
const action = async (): Promise<ApiResponse[]> => {
|
||||||
const results: ApiResponse[] = [];
|
const limit = promiseLimit<ApiResponse>(2);
|
||||||
for (const item of updatedItems) {
|
return await Promise.all(updatedItems.map(async it => limit(() => execute(it))));
|
||||||
results.push(await execute(item));
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = await os.promiseDialog(action());
|
const result = await os.promiseDialog(action());
|
||||||
|
|
|
||||||
|
|
@ -74,34 +74,31 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import { onMounted, ref, useCssModule } from 'vue';
|
import {onMounted, ref, useCssModule} from 'vue';
|
||||||
import { retryOnThrottled } from '@@/js/retry-on-throttled';
|
import {retryOnThrottled} from '@@/js/retry-on-throttled';
|
||||||
import type { RequestLogItem } from '@/pages/admin/custom-emojis-manager.impl.js';
|
import promiseLimit from 'promise-limit';
|
||||||
import type { GridCellValidationEvent, GridCellValueChangeEvent, GridEvent } from '@/components/grid/grid-event.js';
|
import type {RequestLogItem} from '@/pages/admin/custom-emojis-manager.impl.js';
|
||||||
import type { DroppedFile } from '@/utility/file-drop.js';
|
import {emptyStrToEmptyArray, emptyStrToNull, roleIdsParser} from '@/pages/admin/custom-emojis-manager.impl.js';
|
||||||
import type { GridSetting } from '@/components/grid/grid.js';
|
import type {GridCellValidationEvent, GridCellValueChangeEvent, GridEvent} from '@/components/grid/grid-event.js';
|
||||||
import type { GridRow } from '@/components/grid/row.js';
|
import type {DroppedFile} from '@/utility/file-drop.js';
|
||||||
import { misskeyApi } from '@/utility/misskey-api.js';
|
import {extractDroppedItems, flattenDroppedFiles} from '@/utility/file-drop.js';
|
||||||
import {
|
import type {GridSetting} from '@/components/grid/grid.js';
|
||||||
emptyStrToEmptyArray,
|
import type {GridRow} from '@/components/grid/row.js';
|
||||||
emptyStrToNull,
|
import {misskeyApi} from '@/utility/misskey-api.js';
|
||||||
roleIdsParser,
|
|
||||||
} from '@/pages/admin/custom-emojis-manager.impl.js';
|
|
||||||
import MkGrid from '@/components/grid/MkGrid.vue';
|
import MkGrid from '@/components/grid/MkGrid.vue';
|
||||||
import { i18n } from '@/i18n.js';
|
import {i18n} from '@/i18n.js';
|
||||||
import MkSelect from '@/components/MkSelect.vue';
|
import MkSelect from '@/components/MkSelect.vue';
|
||||||
import MkSwitch from '@/components/MkSwitch.vue';
|
import MkSwitch from '@/components/MkSwitch.vue';
|
||||||
import MkFolder from '@/components/MkFolder.vue';
|
import MkFolder from '@/components/MkFolder.vue';
|
||||||
import MkButton from '@/components/MkButton.vue';
|
import MkButton from '@/components/MkButton.vue';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { validators } from '@/components/grid/cell-validators.js';
|
import {validators} from '@/components/grid/cell-validators.js';
|
||||||
import { chooseFileFromDrive, chooseFileFromPc } from '@/utility/select-file.js';
|
import {chooseFileFromDrive, chooseFileFromPc} from '@/utility/select-file.js';
|
||||||
import { uploadFile } from '@/utility/upload.js';
|
import {uploadFile} from '@/utility/upload.js';
|
||||||
import { extractDroppedItems, flattenDroppedFiles } from '@/utility/file-drop.js';
|
|
||||||
import XRegisterLogs from '@/pages/admin/custom-emojis-manager.logs.vue';
|
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;
|
const MAXIMUM_EMOJI_REGISTER_COUNT = 100;
|
||||||
|
|
||||||
|
|
@ -275,12 +272,8 @@ const importEmojis = async (targets: any[]): Promise<void> => {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function action(): Promise<ApiResponse[]> {
|
async function action(): Promise<ApiResponse[]> {
|
||||||
const results: ApiResponse[] = [];
|
const limit = promiseLimit<ApiResponse>(3);
|
||||||
for (const item of targets) {
|
return await Promise.all(targets.map(item => limit(() => execute(item, 'admin/emoji/copy', { emojiId: item.id }))));
|
||||||
results.push(await execute(item, 'admin/emoji/copy', { emojiId: item.id }));
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await os.promiseDialog(action());
|
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);
|
const items = gridItems.value.slice(0, MAXIMUM_EMOJI_REGISTER_COUNT);
|
||||||
|
|
||||||
async function action(): Promise<ApiResponse[]> {
|
async function action(): Promise<ApiResponse[]> {
|
||||||
const results: ApiResponse[] = [];
|
const limit = promiseLimit<ApiResponse>(2);
|
||||||
for (const item of items) {
|
return await Promise.all(items.map(item => limit(() => execute(item, 'admin/emoji/add', {
|
||||||
results.push(
|
name: item.name,
|
||||||
await execute(item, 'admin/emoji/add', {
|
category: emptyStrToNull(item.category),
|
||||||
name: item.name,
|
aliases: emptyStrToEmptyArray(item.aliases),
|
||||||
category: emptyStrToNull(item.category),
|
license: emptyStrToNull(item.license),
|
||||||
aliases: emptyStrToEmptyArray(item.aliases),
|
isSensitive: item.isSensitive,
|
||||||
license: emptyStrToNull(item.license),
|
localOnly: item.localOnly,
|
||||||
isSensitive: item.isSensitive,
|
roleIdsThatCanBeUsedThisEmojiAsReaction: item.roleIdsThatCanBeUsedThisEmojiAsReaction.map((it: any) => it.id),
|
||||||
localOnly: item.localOnly,
|
fileId: item.fileId!,
|
||||||
roleIdsThatCanBeUsedThisEmojiAsReaction: item.roleIdsThatCanBeUsedThisEmojiAsReaction.map((it: any) => it.id),
|
}))));
|
||||||
fileId: item.fileId!,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = await os.promiseDialog(action());
|
const result = await os.promiseDialog(action());
|
||||||
|
|
|
||||||
|
|
@ -161,6 +161,7 @@ import { deviceKind } from '@/utility/device-kind.js';
|
||||||
import MkPagingButtons from '@/components/MkPagingButtons.vue';
|
import MkPagingButtons from '@/components/MkPagingButtons.vue';
|
||||||
import MkSortOrderEditor from '@/components/MkSortOrderEditor.vue';
|
import MkSortOrderEditor from '@/components/MkSortOrderEditor.vue';
|
||||||
import { useLoading } from '@/components/hook/useLoading.js';
|
import { useLoading } from '@/components/hook/useLoading.js';
|
||||||
|
import promiseLimit from "promise-limit";
|
||||||
|
|
||||||
type GridItem = {
|
type GridItem = {
|
||||||
checked: boolean;
|
checked: boolean;
|
||||||
|
|
@ -339,10 +340,8 @@ const importEmojis = async (targets: any[]): Promise<void> => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const results: ApiResponse[] = [];
|
const limit = promiseLimit<ApiResponse>(2);
|
||||||
for (const item of targets) {
|
const results = await Promise.all(targets.map(it => limit(() => execute(it))));
|
||||||
results.push(await execute(item));
|
|
||||||
}
|
|
||||||
|
|
||||||
const failedItems = results.filter(it => !it.success);
|
const failedItems = results.filter(it => !it.success);
|
||||||
if (failedItems.length > 0) {
|
if (failedItems.length > 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue