function createAsyncTask() {
	const value = Math.floor(Math.random() * 10);
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			if (value < 5) reject( Error ${value});
			else resolve(value * 1000);
			}, value * 1000);
	});
}
const tasks = [
createAsyncTask(),
createAsyncTask(),
createAsyncTask(),
createAsyncTask(),
createAsyncTask(),
createAsyncTask(),
];

function asyncSequence(tasks, callback) {
	let results = [];
	let error = [];
	let completed = 0;
	
	tasks.reduce((prev, curr) => {
		return prev.finally(() => {
		return curr
		.then((value) => results.push(value))
		.catch((error) => error.push(error))
		.finally((value) => {
		completed++;
		if (completed === tasks.length) callback(error, results);
		});
		});
	}, Promise.resolve());
}

Example 2 :

async function asyncSequence2(tasks, callback) {
	let result = [];
	let errors = [];
	for (let task of tasks) {
		try {
			let res = await task;
			results.push(res);
		}
		catch (error) {
			errors.push(error);
		}
	}
	callback(errors, result);
}

asyncSequence2(tasks, (error, result) => {
	console.log("error", error);
	console.log("result", result);
});