2017-03-29 2 views
3

ich den Code unten schrieb dann erkannte er früh wurde die Lösung (Anmeldung vor allen Versprechungen resolve):JS Promises: Gibt es eine gute Möglichkeit, mehrere Versprechen als Objekteigenschaften zu lösen?

readDirPromise 
.then(categoriseFiles) 
.then(({movies, series}) => ({ 
    movies: Promise.all(movies.map(movieTasks)), 
    series: Promise.all(series.map(seriesTasks)) 
})) 
.then((res) => { 
    console.log(' done!', res) 
}) 

Ich habe es geschafft, es neu zu schreiben, in der richtigen Reihenfolge zu beheben:

readDirPromise 
.then(categoriseFiles) 
.then((cats) => Promise.all(cats.movies.map(movieTasks)).then((movies) => { 
    cats.movies = movies 
    return cats 
})) 
.then((cats) => Promise.all(cats.series.map(seriesTasks)).then((series) => { 
    cats.series = series 
    return cats 
})) 
.then((res) => { 
    console.log(' done!', res) 
}) 

aber Ich kann nicht anders als zu denken ... gibt es einen besseren, erweiterbaren Weg?

+0

@Randy guter Punkt, aktualisiert – daviestar

Antwort

4

Sie die Serie Schritt laufen unabhängig von den Filmen Schritt machen können (und nicht eine nach der anderen zu blockieren) von beiden in einer anderen Schicht von Promise.all Einwickeln, zurück als Tupel kommen, die Sie dann in das Objekt denaturiert, und neu zu strukturieren können Sie wollen:

readDirPromise 
.then(categoriseFiles) 
.then(({movies, series}) => Promise.all([ 
    Promise.all(movies.map(movieTasks)), 
    Promise.all(series.map(seriesTasks))]) 
.then(([movies, series]) => ({movies, series})) 
.then((res) => { 
    console.log(' done!', res) 
}) 
+0

Großartig, das macht sehr viel Sinn. Ich vergesse immer wieder, dass du solche Arrays zerstören kannst, danke! Ich werde das für ein paar Tage offen halten, falls es andere interessante Lösungen gibt, aber dies scheint die Frage gut zu beantworten. – daviestar

+0

Sie müssen '{Filme, Serien}' und '[Filme, Serien]' in Klammern btw – daviestar

+0

Mm, wahr. Nicht sicher, wo ich den Begriff irgendwo mitten in der Schreibweise dieser Antwort aufgegriffen habe, dass Destrukturierung als abgegrenzte Argumentliste gewertet wird, was bedeutet, dass keine Klammern notwendig wären. (Kommen Sie, um es zu denken, sollte es nicht sein?) –

0

Anstatt die Versprechungen zu verketten, können Sie separate Versprechungen erstellen und sie in der Promise.all-Methode lösen, wie Sie getan haben.

var p1 = getNewPromise(); 
var p2 = getNewPromise(); 
var p3 = getNewPromise(); 

// Von MDN

Promise.all([p1, p2, p3]).then(values => { 
    console.log(values); 
}); 
+0

Ahh .. Ich denke, ich Ihren Punkt - nicht ein Objekt mit Schlüssel zurückgeben, sondern erstellen Versprechen als Variablen dann wieder 'Versprechen .all() '- jedoch ändert dies die aufgelöste Datenform ohne einen klaren Weg, um sie wieder zu erhalten. – daviestar

2

Für das, was es wert ist, glaube ich, von der Asynchron/await versio n hierfür wäre so etwas wie:

async function generateResponse() { 
    const {movies, series} = await readDirPromise.then(categoriseFiles); 
    return { 
    movies: await Promise.all(movies.map(movieTasks)), 
    series: await Promise.all(series.map(seriesTasks)) 
    } 
} 
Verwandte Themen