Mit einem Array von Promises wie kann ich warten zu lösen, bis sie vor dem Fortfahren alle gelöst haben?Warten auf Promises in einem Array
Unten ist eine Beispielimplementierung, wo task_2
feuert seine Ablehnung vor task_1
auslösen kann.
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>
Was ist die Frage? Was verhält sich nicht wie erwartet? Es ist wirklich nicht notwendig, ein neues Versprechen in Ihrem Taskrunner zu erstellen, Sie können einfach 'Promise.all (..)' zurückgeben. –
Gemäß der Dokumentation Versprechen Alle wird abgelehnt, wenn eines der Elemente abgelehnt wird: https: // Entwickler. Mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Promise/all –
@DanielB Die erste Aufgabe wird nicht zuerst abgelehnt, zweitens, wie könnte ich die Ablehnung einer Aufgabe, die nicht in der 'config' existiert, nur mit umgehen Rückgabe von 'promise.all()'? – MindVox