Javascript 从异步函数获取常量值

Javascript 从异步函数获取常量值,javascript,react-native,Javascript,React Native,这是我的密码 const fbLoginData= {} function _responseInfoCallbackID (error, result) { if (error) { fbLoginData.error="Unable to fetch data.Try again later or use other methods to sign-in" } else { fbLoginData.id = result.id fbLoginData.

这是我的密码

const fbLoginData= {}

function _responseInfoCallbackID (error, result) {
  if (error) {
    fbLoginData.error="Unable to fetch data.Try again later or use other methods to sign-in"
  } 
  else {
    fbLoginData.id = result.id
    fbLoginData.email=result.email
    fbLoginData.name=result.name
    }
}

function _responseInfoCallbackPicture (error, result) {
  if (error) {
    fbLoginData.error="Unable to fetch data.Try again later or use other methods to sign-in"
  } 
  else {
    fbLoginData.profile= result.data.url
    }
}

export async function logInFB () {

    try{
      const login = await LoginManager.logInWithPermissions(["public_profile","email"])
      const value = await getValue(login)
      console.warn(" THE VALUE I AM SENDING ",value)
      return value
    }

    catch(error)
    {
      fbLoginData.error= "Unable to fetch Data"
    }
  }



const getValue = (result)=> {
  if (!result.isCancelled) {
    return AccessToken.getCurrentAccessToken().then(
      (data) => {

        fbLoginData.accessToken = data.accessToken

        const infoRequest = new GraphRequest(
          '/me',
          {
            accessToken,
            parameters: {
              fields: {
                string: 'email,name'
              }
            }
          },
          _responseInfoCallbackID,
        );

        const pictureRequest = new GraphRequest(
          `/me/${PICTURE_PARAM}`,
          {
            accessToken,        
          },
          _responseInfoCallbackPicture,
        );

        // Start the graph request.
        new GraphRequestManager().addRequest(infoRequest).start()
        new GraphRequestManager().addRequest(pictureRequest).start()
        return  fbLoginData
      }
    )
  } 
}

我希望在调用回调函数
\u responseinfo callbackid
\u responseinfo callbackpicture
后,用数据填充fbLoginData对象。但是异步函数loginFB值不返回除访问令牌之外的任何其他数据,但我需要返回的id、email和name。我知道问题是由于异步性造成的,如何获得包含所有所需数据的fbLoginData?我想不出我该怎么做。关于如何让loginFB返回fbLoginData值以及我想要的id、电子邮件、名称和图像,有什么帮助吗

此问题可通过以下步骤解决:

  • 包装图形请求的
    new GraphRequestManager().addRequest(回调).start()
    在承诺块内

  • 创建一个全局对象
    promiseContainer
    ,并将上面创建的承诺的resolve和reject方法添加到该对象中

  • 把以上承诺传递给Promise.all

  • 使用
    promiseContainer
    解析
    回调
    函数内部的承诺
  • all()方法返回一个承诺,当作为iterable传递的所有承诺都已解析或iterable不包含承诺时,该承诺将解析

    const fbLoginData={};
    const promiseContainer={};
    函数_responseInfo回调ID(错误、结果){
    //早期代码
    promiseContainer.infoPromise.resolve(true);
    }
    函数_responseInfo回调图片(错误、结果){
    //早期代码
    承诺容器。图片预测。解决(真);
    }
    //早期代码
    const getValue=result=>{
    如果(!result.isCancelled){
    返回AccessToken.getCurrentAccessToken()。然后(数据=>{
    //早期代码
    const infoPromise=新承诺(函数(解析、拒绝){
    promiseContainer['infoPromise']={解析,拒绝};
    新建GraphRequestManager().addRequest(infoRequest).start();
    });
    const picturePromise=新承诺(函数(解析、拒绝){
    promiseContainer['picturePromise']={resolve,reject};
    新建GraphRequestManager().addRequest(pictureRequest.start();
    });
    返回承诺。全部([infoPromise,picturePromise])。然后(()=>fbLoginData);
    });
    }
    
    };此问题可通过以下步骤解决:

  • 包装图形请求的
    new GraphRequestManager().addRequest(回调).start()
    在承诺块内

  • 创建一个全局对象
    promiseContainer
    ,并将上面创建的承诺的resolve和reject方法添加到该对象中

  • 把以上承诺传递给Promise.all

  • 使用
    promiseContainer
    解析
    回调
    函数内部的承诺
  • all()方法返回一个承诺,当作为iterable传递的所有承诺都已解析或iterable不包含承诺时,该承诺将解析

    const fbLoginData={};
    const promiseContainer={};
    函数_responseInfo回调ID(错误、结果){
    //早期代码
    promiseContainer.infoPromise.resolve(true);
    }
    函数_responseInfo回调图片(错误、结果){
    //早期代码
    承诺容器。图片预测。解决(真);
    }
    //早期代码
    const getValue=result=>{
    如果(!result.isCancelled){
    返回AccessToken.getCurrentAccessToken()。然后(数据=>{
    //早期代码
    const infoPromise=新承诺(函数(解析、拒绝){
    promiseContainer['infoPromise']={解析,拒绝};
    新建GraphRequestManager().addRequest(infoRequest).start();
    });
    const picturePromise=新承诺(函数(解析、拒绝){
    promiseContainer['picturePromise']={resolve,reject};
    新建GraphRequestManager().addRequest(pictureRequest.start();
    });
    返回承诺。全部([infoPromise,picturePromise])。然后(()=>fbLoginData);
    });
    }
    };