2017-07-16 8 views
1
せずに待つことができないが

こんにちは私は要求を待っているため、繊維を使用しようとしているが、それはエラーになりますそれを使って作業してください。純粋なnodejだけで流星を使用しないでください。繊維/未来ファイバー

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 

答えて

1

now_playing.wait()コールはファイバの「コンテキスト」内で実行する必要があります。これは、トップレベルのイベントコンテキスト(例えば、setTimeoutコールバックから)で実行することも、デフォルトの初期コンテキストで実行することもできません。

ファイバーでコンテキストを取得する最も直接的な方法は、新しいFiberを作成し、run()を呼び出します。しかし、あなたのためにファイバーを作り出す環境はたくさんあります(たとえば、Meteorの使用に慣れていれば、Meteorはおそらくファイバーを作成しています)。

この問題は必ずしもこのコードではありません。 Movie.now_playingの呼び出し元は、メソッドがファイバーコンテキストで呼び出されていることを確認する必要があります。ファイバが他にある場合は、トップレベルのイベントコールバックではなく、そのコンテキストで呼び出されていることを確認してください(たとえば、光ファイバ非対応のノードモジュールがOSイベントに応答してコールバックを呼び出す可能性がありますあなたが自分ですべてを動かしているなら、最初のファイバーを作成して実行して、ファイアウォールのコンテキストに入り、「待機」が許されるようにしてください。

先物と制御フローは:また、あなたのrequestコールバックは、両方の「復帰」文が実行されます「エラー」の場合のように、少し壊れています。一般的に、将来の "return"や "throw"を呼び出すときは、コードに制御フローセマンティクスを一致させるために、returnという接頭辞を付けるべきです。

request(options,(error,response,body)=>{ 
    if (error) return now_playing.return(error); 
    return now_playing.return(response); 
}); 
関連する問題