async do() {
        // If list is empty, end run
        if (this.list.length === 0) {
            this.isRunning = false;
            return;
        }

        this.isRunning = true;
        const takeList = [];
        for (let i = 0; i < this.max; i++) {
            const task = this.list.shift();
            if (task) {
                takeList.push(task);
            }
        }

        // Execute all task
        const runningList = takeList.map((task) => task());
        await Promise.all(runningList);

        // Execute next batch
        await this.do();
    }
Execute a batch of tasks
@returns {Promise<void>}