2016-01-19 5 views
0

J'ai un projet utilisant des générateurs Koa et je suis frustré d'écrire des "contrôleurs". J'ai cherché des exemples, mais en réalité il n'y a pas beaucoup de résultats sur Github basés sur les mots-clés, donc je pense que je fais quelque chose de mal.Confus au sujet des fonctions Koa avancées

Mon application utilise koa-router pour acheminer les points de terminaison aux générateurs.

Ensuite, le contrôleur se présente comme suit

export function* postEvent() { 
    const self = this 

    const user = yield User.findOne({slug: this.params.slug}).exec() 

    if (user) { 
    user.events.push({ 
     [ ... ] 
    }) 
    yield user.save((error, event) => { 
     yield postBlacklist({ 
     [ ... ] 
     }) 
     .then(event => { 
     self.status = 200 
     self.body = "Event created for: " + user.slug 
     }) 
    }) 
    } else { 
    [ ... ] 
    } 
} 

Comme vous pouvez le voir, ce générateur ne fonctionne pas. J'utilise yield pour que l'application attende user.save() pour terminer. Mais je ne peux pas faire yield postBlacklist() parce que j'ai "épuisé" ma commande yield. Si j'enlève le second yield, j'obtiendrai un 404.

Alors, comment est-ce que j'emboîterais une promesse-retour dans un autre comme ceci?

Répondre

0

Non, vous ne pouvez pas céder à partir d'un rappel. Mais pourquoi ça ne marchera pas?

export function* postEvent() { 
    const user = yield User.findOne({slug: this.params.slug}).exec() 

    if (user) { 
    user.events.push({ 
     [ ... ] 
    }) 

    // should return a promise in latest versions of mongoose. 
    // Otherwise, write your own wrapper which does so. 
    var event = yield user.save(); 

    yield postBlacklist({ 
     [ ... ] 
    }) 
    .then(event => { 
     this.status = 200 
     this.body = "Event created for: " + user.slug 
    }); 
    } else { 
    [ ... ] 
    } 
}