La façon d'aborder une promesse est qu'elle revient immédiatement avec une valeur, et cette valeur elle-même est une promesse.
Cette promesse accepte un rappel qui sera appelé dans le futur, lorsque son état interne sera résolu. Ce rappel est passé dans une méthode then
, disponible sur le Promise.prototype
. Si le callback passé en then
renvoie une autre promesse, cette promesse est attachée à la chaîne, puis elle a sa propre méthode then
et le processus peut se répéter.
Here's a guide et voici les docs.
Dans cet esprit, voici comment vous pouvez résoudre votre problème. Vous voulez obtenir tous les livres de chaque auteur, où à la fois obtenir un auteur et obtenir un livre est une opération asynchrone qui renvoie une promesse. L'outil idéal pour cela est la méthode Promise.all
, qui dans Ember est Ember.RSVP.all
, où vous pouvez d'abord obtenir tous les auteurs, puis résoudre la promesse, puis mapper chaque auteur à une promesse qui obtient leurs livres, puis résoudre la promesse avec un tableau de tableaux de livres correspondant à chaque auteur, que vous pouvez ensuite aplatir si nécessaire:
// make request for all authors
child.get('authors')
.then(authors => {
// once you have all authors, make request for all books
const promiseOfBooks = authors.map(author => author.get('books'));
return Ember.RSVP.all(promiseOfBooks)
})
.then(arrayOfArraysOfBooks => {
// once you have an array of arrays of books for each author
// flatten that into an array of a single level of nesting
return [].concat(...arrayOfArraysOfBooks);
})
.then(favoriteList => {
// ...
});
Le code peut être nettoyé à:
const {
RSVP: { all: allPromises }
} = Ember;
child.get('authors')
.then(authors => allPromises(
authors.map(author => author.get('books'))
))
.then(arrayOfArraysOfBooks => [].concat(...arrayOfArraysOfBooks))
.then(favoriteList => {
// ...
});
un grand merci pour votre réponse @ nem035, mais il sont quelques problèmes. La première est "' Erreur: Les méthodes de tableau doivent être fournies par Array' "quand je l'utilise et l'erreur est dans la première ligne:' allPromises (child.get ('authors')) '. Alors je ne comprends pas tout à fait quelle est la portée de tout cela car dans mon code cette partie fonctionne! 'child.get ('authors'). forEach (author => author.get ('livres'). forEach (book => {' est bon La partie dont j'ai besoin d'une main est la seconde, où j'ai le forEachs C'est un gâchis, j'ai besoin des opérations forEach pour travailler et juste à la fin j'ai besoin d'un '.then' Comment? –