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
4

1 回答 1

1

now_playing.wait()调用需要在光纤的“上下文”中执行。它不能在顶级事件上下文(例如,从setTimeout回调)中执行,也不能在默认初始上下文中执行。

使用纤程获取上下文的最直接方法是创建一个新的Fiber并在其上调用run()。但是有很多环境可以为您创建 Fiber(例如,如果您习惯使用 Meteor,Meteor 可能会为您创建 Fiber)。

因此,问题不一定与此代码有关。的调用者Movie.now_playing需要确保在光纤上下文中调用该方法。如果您在其他地方有纤程,请确保在该上下文中调用它,而不是在顶级事件回调中调用(例如,不支持纤程的节点模块可能会调用回调以响应操作系统事件——这赢了'不是一个纤程上下文。)如果您自己滚动所有内容,请确保您已经创建了第一个纤程并运行它以进入允许“等待”的纤程上下文。

带有期货的控制流:此外,您的request回调有点损坏,因为在“错误”情况下,两个“返回”语句都将执行。一般来说,在未来调用“return”或“throw”时,您可能应该在该行前加上前缀return以将控制流语义与代码匹配:

request(options,(error,response,body)=>{
    if (error) return now_playing.return(error);
    return now_playing.return(response);
});
于 2017-12-22T01:28:22.707 回答