2017-07-16 80 views
1
等待

你好,我试图用纤维等待请求,但它给出了一个错误纤维/未来离不开光纤

“错误:没有纤维不能等待”

我应该怎么做的工作与。那么我不使用流星只是纯粹的nodejs。

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可能会为你创建光纤)。

所以,这个问题不一定是这个代码。 Movie.now_playing的调用者需要确保该方法在光纤环境中被调用。如果你在其他地方有光纤,那么确保在这种情况下调用它,而不是在顶级事件回调中调用(例如,光纤未知的节点模块可能会响应操作系统事件调用回调 - 不是光纤环境。)如果你自己在滚动所有东西,确保你已经创建了第一个光纤并运行它以进入一个允许“等待”的光纤环境。

期货的控制流程:此外,您的request回调有点破,因为在“error”情况下,“return”语句都会执行。通常,在将来调用“return”或“throw”时,您应该在行的前面添加return以使控制流语义与代码匹配:

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