С Массив Promises как подождать, пока все они не будут решены, прежде чем продолжить?
Ниже приведен пример реализации, где task_2
запускает его отклонение до того, как task_1
может запускаться.
const $output = $$('output')
const config = {
task_1: [
val => new Promise((resolve, reject) => setTimeout(() => reject('Awaited error'), 2000)),
val => new Promise((resolve, reject) => resolve(val))
],
task_2: [
val => new Promise((resolve, reject) => resolve(val)),
val => new Promise((resolve, reject) => reject('An error')),
]
}
taskRunner({
task_1: 'task parameters',
task_2: 'task parameters'
})
.then(res => $output.text(res).fadeIn())
.catch(err => $output.text(err).fadeIn())
function taskRunner(tasks) {
return new Promise((resolve, reject) => {
let arr = []
for (const task in tasks) {
if (!config.hasOwnProperty(task)) return reject(`${task} has no tasks`)
arr.push(config[task].map((cb => cb(tasks[task]))))
}
const toRun = arr.reduce((a, b) => a.concat(b))
Promise.all(toRun)
.then(res => resolve(res))
.catch(err => reject(err))
})
}
function $$(data) {
return $('[data-' + data + ']')
}
html, body { margin: 0; padding: 0 }
div.output {
font-family: 'Courier', monospace;
color: #383838;
margin: 15px;
padding: 15px 20px;
background: #fafafa;
border-radius: 3px;
border-bottom: 1px solid #dadada;
}
.js-hide { display: none }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="output js-hide" data-output></div>