首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在meteor-react呈现()方法中使用异步meteor.call()

在meteor-react呈现()方法中使用异步meteor.call()
EN

Stack Overflow用户
提问于 2016-02-24 16:51:24
回答 1查看 2.1K关注 0票数 1

我正在使用流星和反应我的应用程序。在我的应用程序中,我使用帐户-ui,帐户- facebook让用户能够通过使用facebook帐户登录。现在,我想检查用户是使用facebook登录还是普通用户/pass登录。我查看用户集合并看到

代码语言:javascript
复制
1) if user used facebook to login, there is services.facebook in user collection
2) if user used regular user/pass to login, there is services.password  in users collection

在服务器中,我有返回loginservice (facebook或密码)的方法。

代码语言:javascript
复制
Meteor.methods({
        getLoginService: function(){
            let services = Meteor.user().services;
            if (typeof services.facebook!=='undefined'){
                return 'facebook';
            }else if (typeof services.password!=='undefined'){
                return 'password';
            }
            return 'undefined';
        },
    });

在客户端,如果将检查这是(facebook登录)还是(用户/通过登录),那么我可以相应地呈现屏幕。

代码语言:javascript
复制
App.Components.Dashboard = React.createClass({

  render() {
    var lservice='';
    Meteor.call("getLoginService",function(error,service) {
      if (error){
      }else {
            lservice = service;
      }
    });

    if (lservice === 'facebook'){
        return (
            <div id="dashboard-content">
              <div className="row">
                <div className="col-lg-12">
                  <h1 className="page-header">Facebook connect</h1>
                  <p>put facebook information here</p>
                </div>
              </div>
            </div>
        );



    }else{
        return (
            <div id="dashboard-content">
              <div className="row">
                <div className="col-lg-12">
                  <h1 className="page-header">Facebook connect</h1>
                  <p>put facebook connect button here</p>
                </div>
              </div>
            </div>
        );
      }

  }
});

问题在客户端。因为Meteor.call是异步的,所以lservice不会从回调函数中获得值。我还试图找到一种将html返回到回调函数(错误、服务)中的方法,但没有成功。

你知道怎么解决这个问题吗。或者,您有什么更好的想法来识别用户用来登录的服务(可能是一个帐户挂钩-facebook)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-24 17:02:39

首先,将对Meteor.call的调用移到componentWillMount中,以便它只运行一次--就在组件第一次呈现之前。

每次状态或道具发生变化时,都会调用render方法中的代码,您可能只需要获得一次登录服务。

接下来,不要将service字符串存储在局部变量中,而是将其存储在state中,以便组件在每次更新时呈现。

代码语言:javascript
复制
getInitialState() {
  return {};
},
componentWillMount() {
  Meteor.call("getLoginService", (error, service) => {
    if(error) {
      // handle error
    } else {
      this.setState({ service });
    }
  });
},
render() {
  const { service } = this.state;

  if(service === 'facebook') {
    // return facebook view
  } else if(service === 'password') {
    // return password view
  } else {
    // return loading view
  }
}

应用程序第一次呈现时,服务可能不可用(它将等待请求返回),因此它将在else子句中呈现your视图。

但是,当调用回调时(如果没有错误),组件的状态将被更新,组件将重新呈现。

这一次,服务将可用,并将显示正确的视图。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35608199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档