2017-06-30 3 views
-1

J'ai ce code:ember.js 2, rendre ce code thenable, forEach dans la promesse

child.get('authors').forEach(author => author.get('books').forEach(book => { 

    let time = (Math.floor(Math.random() * 10) + 1) * 1000; 

    Ember.run.later(() => { 

    //Some operations and then every book in the forEach is added to my favoriteList 
    favoriteList.pushObject(book); 

    }, time); 

})); 

Et je besoin de ce message à apparaître après tout ce travail forEach. J'ai besoin de ce message (et d'autres actions) pour s'exécuter enfin, après tout pourChaqueEchaque.

Je sais que je dois utiliser: RSVP, Promises, EmberPromiseMixin et ces trucs mais c'est un gâchis!

Suggérez-vous le code et quelque chose de beau site ou livre ou quelque chose pour finalement apprendre une fois pour toutes ces choses?

Répondre

1

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 => { 
    // ... 
    }); 
+0

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? –