/** * Copyright 2020 Angus.Fenying * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-magic-numbers */ export type IWaitResult = { success: true; result: T; } | { success: false; result: E; }; /** * Sleep for determined time and then wake up. * * NOTE: This method SHOULD never fail because timer wouldn't be cancelled. * * @param ms Milliseconds to wait * @param args The result of promise resolved. */ export function sleep( ms: number, ...args: T ): Promise { return new Promise((resolve) => setTimeout(resolve, ms, args)); } declare function setImmediate(cb: any): void; /** * Call the function after 0ms, which means in next tick. */ export const nextTick: ( fn: (...args: T) => void, ...args: T ) => void = typeof setImmediate === 'function' ? setImmediate : function(fn: Function, ...args: any[]): void { setTimeout(fn, 0, ...args); }; /** * Wait for multi-tasks, and get all results, whatever succeed or failed. * * @param tasks The all tasks' promises. */ export function multiTasks( tasks: Array> ): Promise>> { return new Promise>>(function(resolve): void { let ret: Array> = Array(tasks.length); let done: number = 0; for (let i = 0; i < tasks.length; i++) { tasks[i].then(function(r): void { ret[i] = { success: true, result: r }; if (++done === tasks.length) { resolve(ret); } }).catch(function(e): void { ret[i] = { success: false, result: e }; if (++done === tasks.length) { resolve(ret); } }); } }); }