Как вернуть данные от обратного вызова Graph API - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь реализовать функцию подписки с помощью Facebook для моего приложения-носителя, и я застрял на этом этапе, когда данные успешно извлекаются из профиля, и я проверил их на экране предупреждения.Вот мой код, в котором я вызываю функцию другого компонента (FBLogin). Прежде всего, есть Touchable Opacity (пользовательский интерфейс для кнопки входа в Facebook)

<TouchableOpacity  // This is in the Main Screen
          onPress={() => {
                this.goFacbookLogin()
              }}
</TouchableOpacity>

Вот моя функция, которая вызываетсяна мероприятии onPress.

async goFacbookLogin(){ // This is also a function on the Main Screen

await FBLogin.facebookLogin().then((data) =>{
  alert("Data: " + JSON.stringify(data));
});

}

Теперь FBLogin - это в основном сервис для входа на Facebook.и у него есть функция facbookLogin ()

import React, { Component } from 'react';
import { View, Button, Dimensions } from 'react-native';
import {LoginManager, LoginButton, 
AccessToken,GraphRequest,GraphRequestManager } from 'react-native-fbsdk';


class FBLoginButton extends Component{// This is Implemented in another File 
 constructor(props) 
 {
  super(props);
  this.state = 
  {
    //screenWidth: Dimensions.get("window").width,
    //screenHeight: Dimensions.get("window").height,
    UserProfileInformation: 
    {
      UserAge: null,
      Gender: null,
      UserLocation: null,
      ImageUrl: null,
    }
   }
  }


async facebookLogin() 
{
  let _result;
  try 
  { 
    LoginManager.setLoginBehavior('NATIVE_ONLY');  
    _result = await LoginManager.logInWithReadPermissions(['public_profile', 
    "email","user_birthday", "user_gender","user_hometown"]);
    console.warn("Done");
  } 
  catch (nativeError) 
  {
   try 
   {
       LoginManager.setLoginBehavior('WEB_ONLY');
    _result = await LoginManager.logInWithReadPermissions(['public_profile', 
   "email", "user_birthday", "user_gender", "user_hometown"]);
   } 
   catch (webError) 
   {
     alert("Function Called Web Error");
   }
  }

 if (_result.isCancelled) 
 {
   alert('Login Cancel')
 } 
 else 
 {
     global.res1 = "None";
     const data = await AccessToken.getCurrentAccessToken();
     const infoRequest = new GraphRequest
     (
       '/me',
       {
         accessToken: data.accessToken,
         parameters: 
         {
           fields: 
           {
            string: 'first_name, name, gender, birthday, email, hometown'
           }
         }
       },
       (error, result) => {
       if (error) 
       {
         alert("error: " + JSON.stringify(error));
       } 
      else 
       {
         let UserProfileInformation = this.state.UserProfileInformation;  
         UserProfileInformation['Gender'] = result.gender;
         UserProfileInformation['UserLocation'] = result.hometown.name;
         this.setState({ UserProfileInformation: UserProfileInformation}, () 
        => console.warn("DDDDD: " + this.state.UserProfileInformation));
         res1 = result;
       }
     }
   );
    new GraphRequestManager().addRequest(infoRequest).start()
    return(this.state.UserProfileInformation);
  }
  //return "Done";
  }
 }
 export default FBLogin = new FBLoginButton();

Теперь проблема в том, что когда Graph Request запускает InfoRequest, он успешно выбирает данные в функции обратного вызова, но я понятия не имею, как вернуть его на главнуювызов функции, в которой я реализовал оператор затем после вызова функции.В настоящее время данные хранятся в состоянии, но, поскольку состояние требует времени для изменения оператора возврата, выполненного досрочно, и я получил значение NULL, но когда я нажимаю кнопку непрозрачности во второй раз, данные верны, так как было изменено предыдущее состояние.Я попробовал глобальные и пустые переменные, но они были уничтожены после завершения функции обратного вызова.

Короче говоря, все, что я хочу, это вернуть этот результат в facebookLogin на главном экране.

Я новичок в React Native, так что если кто-то может помочь, это будет действительно оценено.

...