【问题标题】:Fibers/Future Can't Wait without Fiber纤维/未来不能等待没有纤维
【发布时间】:2017-07-16 15:56:55
【问题描述】:

您好,我正在尝试使用光纤等待请求,但它给出了错误

'错误:没有光纤就无法等待'

我应该怎么做。顺便说一下,我不使用流星,只是纯 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

【问题讨论】:

    标签: node.js npm npm-request


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-13
      • 2013-08-23
      • 1970-01-01
      • 2014-05-31
      • 2011-07-16
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多