2017-07-16 2 views
1

Bonjour je suis en train d'utiliser des fibres pour les demandes en attente, mais il donne une erreurfibres/avenir ne peut pas attendre sans fibre

« Erreur: ne peut pas attendre sans une fibre »

Que dois-je faire pour travailler avec ça.En passant, je n'utilise pas de météore juste des nodejs purs.

const Fiber = require('fibers') 
const Future = require('fibers/future') 
const request = require('request') 
const v3_key = "*****"; 

// Application Declartion 
function Movie() { 
    this.apiKey = v3_key; 
} 

/** 
Now playing search on tmdb with 
    page 
    language 
*/ 
Movie.now_playing = (page,language) =>{ 

    let now_playing = new Future() 

    const options = { 
     method:"GET", 
     url:"https://api.themoviedb.org/3/movie/now_playing", 
     qs:{ 
      page:page ? page : 1, 
      language:language ? language : "en-US", 
      apiKey:v3_key 
     }, 
     body:'{}' 
    }; 

    request(options,(error,response,body)=>{ 
     if(error) now_playing.return(error); 


     now_playing.return(response); 

    }); 

    console.log(now_playing); 
    return now_playing.wait(); 

}; 


module.exports = Movie 

Répondre

1

L'appel now_playing.wait() doit être exécuté dans le « contexte » d'une fibre. Il ne peut pas être exécuté dans un contexte d'événement de niveau supérieur (par exemple, à partir d'un rappel setTimeout) ni dans le contexte initial par défaut.

La manière la plus directe d'obtenir un contexte avec une fibre est de créer un nouveau Fiber et d'appeler run() dessus. Mais il y a beaucoup d'environnements qui créent des fibres pour vous (par exemple, Meteor crée probablement la fibre pour vous si vous avez l'habitude d'utiliser Meteor). Par conséquent, le problème n'est pas nécessairement lié à ce code. L'appelant de Movie.now_playing doit s'assurer que la méthode est invoquée dans un contexte de fibre. Si vous avez des fibres ailleurs, assurez-vous qu'elles sont invoquées dans ce contexte, et non dans un rappel d'événement de niveau supérieur (par exemple, les modules de nœuds non sensibles à la fibre peuvent invoquer un rappel en réponse à un événement du système d'exploitation). Ne soyez pas un contexte de fibre.) Si vous roulez tout vous-même, assurez-vous que vous avez créé la première fibre et lancez-la pour entrer dans un contexte de fibre où «attendez» est permis.

Flux de contrôle avec des contrats à terme: En outre, votre request rappel est un peu cassé, comme dans le cas « d'erreur » les deux déclarations « de retour » seront exécutés. En général, lorsque vous invoquez "return" ou "throw" sur un futur, vous devez probablement préfixer la ligne avec return pour faire correspondre la sémantique du flux de contrôle au code:

request(options,(error,response,body)=>{ 
    if (error) return now_playing.return(error); 
    return now_playing.return(response); 
});