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方法添加到该对象中promiseContainer
解析回调
函数内部的承诺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);
});
}
};代码>