Javascript 如何处理承诺

Javascript 如何处理承诺,javascript,reactjs,react-native,promise,Javascript,Reactjs,React Native,Promise,我对承诺有问题,我编写了一个函数,尝试从共享首选项获取数据,一旦收到,我将返回一个承诺。 在我使用的函数中,它返回未处理的承诺拒绝无法读取未定义的属性 下面是我的函数,它从共享首选项获取数据并返回一个承诺 export function isMock(){ const returned = getSharedPreferenceValue( Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {

我对承诺有问题,我编写了一个函数,尝试从共享首选项获取数据,一旦收到,我将返回一个
承诺
。 在我使用的函数中,它返回
未处理的承诺拒绝无法读取未定义的属性

下面是我的函数,它从共享首选项获取数据并返回一个承诺

  export function isMock(){
    const returned = getSharedPreferenceValue( Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {  
        consoleLog('isMock - ' + isTestUser);//THIS LINE WORKS 
        return Promise.resolve(isTestUser === 'true' ? true : false);
      })
      .catch(err => {
        consoleLog('error -' + err);
        return {error:err, response: null};
      });
}
export function login ( ABCD, XYZ ){
    const returned = isMock().then((isMock) => {
        consoleLog('login Legacy API - isMock() - ' + isMock);//THIS WORKS
        if(!isMock){
            console.log('isMock is false');
        }else{

            consoleLog('mock data - ../mockData/login.json');
            var user = require('../mockData/login.json');//WORKS

            return Promise.resolve(user);//PROBLEM MIGHT BE HERE
        }
    })
    .catch(error => {
          console.log('Login isMock - error - ' + JSON.stringify(error));
      });
}
这里是我尝试使用上述函数的函数

export function login ( abcd, xyz ){

    const returned = isMock().then((isMock) => {
        //Do some based on isMock.
        console.log(`Login isMock - ` + isMock); //DOES NOT PRINT
    })
    .catch(error => {
          console.log('Login isMock - error - ' + JSON.stringify(error));
      });
}
这是错误消息

Possible Unhandled Promise Rejection (id: 0):
TypeError: Cannot read property 'then' of undefined
TypeError: Cannot read property 'then' of undefined
你能告诉我哪里出了问题吗

更新

按照答案创建新承诺解决了该函数中的问题,但错误来自另一个函数

函数inMock,现在已修复

export function isMock(){
    return new Promise((resolve, reject) => {
        getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then(isTestUser => {
          consoleLog('isMock - ' + isTestUser);
          resolve(isTestUser === 'true' ? true : false);
        }).catch(err => {
          consoleLog('error -' + err);
          reject(err)
        });
      });
}
isMock在这里被调用,issue在else语句中,它返回一个承诺

  export function isMock(){
    const returned = getSharedPreferenceValue( Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {  
        consoleLog('isMock - ' + isTestUser);//THIS LINE WORKS 
        return Promise.resolve(isTestUser === 'true' ? true : false);
      })
      .catch(err => {
        consoleLog('error -' + err);
        return {error:err, response: null};
      });
}
export function login ( ABCD, XYZ ){
    const returned = isMock().then((isMock) => {
        consoleLog('login Legacy API - isMock() - ' + isMock);//THIS WORKS
        if(!isMock){
            console.log('isMock is false');
        }else{

            consoleLog('mock data - ../mockData/login.json');
            var user = require('../mockData/login.json');//WORKS

            return Promise.resolve(user);//PROBLEM MIGHT BE HERE
        }
    })
    .catch(error => {
          console.log('Login isMock - error - ' + JSON.stringify(error));
      });
}
登录的主要调用函数在这里,这给了我一个错误

loginUser_legacy = async (ABCD, XYZ) => {  
    const returned = await login(cardDigits, nationalIdNumber).then((res) => {
      consoleLog('res - ' + res);//DOES NOT WORK
    });

  }
谢谢
R

我想,你不是在
isMock()
中返回
returned

因此,尽管在
catch
中返回
{error:err,response:null}
,但实际上从未得到错误,因为您是
return Promise.resolve(isTestUser=='true'?true:false)
总是返回一个
已解析的
(虽然是用
true
false
解析的),因此永远不会进入catch(它也是异步的,因此不会实际返回)

编辑,可能的操作:

export function isMock(){
  return new Promise((res,rej)=> {
   getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {  
    res(isTestUser === 'true')
  }).catch(rej)
 }
}


一个新的承诺得到了回报;这将
getSharedReferenceValue
,如果成功,则用您的答案解决新承诺。如果此操作失败,请将错误传递到拒绝函数,该函数也将传递回将捕获它的调用方。

我想,您是否在
isMock()
中返回
returned

因此,尽管在
catch
中返回
{error:err,response:null}
,但实际上从未得到错误,因为您是
return Promise.resolve(isTestUser=='true'?true:false)
总是返回一个
已解析的
(虽然是用
true
false
解析的),因此永远不会进入catch(它也是异步的,因此不会实际返回)

编辑,可能的操作:

export function isMock(){
  return new Promise((res,rej)=> {
   getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {  
    res(isTestUser === 'true')
  }).catch(rej)
 }
}


一个新的承诺得到了回报;这将
getSharedReferenceValue
,如果成功,则用您的答案解决新承诺。如果此操作失败,请将错误传递到拒绝函数,该函数也将传递回将捕获它的调用方。

看起来该函数应该是GetSharedReferences()而不是GetSharedReferencesValue()

看起来该函数应该是GetSharedReferences()而不是GetSharedReferencesValue()您不必使用Promise.resolve,因为getSharedPreferenceValue本身就是一个Promise。。。您可以尝试只返回值

此外,您不应按照以下要求解析可启用函数中的承诺:

您可以尝试这种方法,也可以简单地使用async/await

export function isMock(){
const returned = getSharedPreferenceValue( Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {  
    consoleLog('isMock - ' + isTestUser);//THIS LINE WORKS 
    return isTestUser === 'true' ? true : false;
  })
  .catch(err => {
    consoleLog('error -' + err);
    return {error:err, response: null};
  });

}您不必使用Promise.resolve,因为getSharedPreferenceValue本身就是一个Promise。。。您可以尝试只返回值

此外,您不应按照以下要求解析可启用函数中的承诺:

您可以尝试这种方法,也可以简单地使用async/await

export function isMock(){
const returned = getSharedPreferenceValue( Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {  
    consoleLog('isMock - ' + isTestUser);//THIS LINE WORKS 
    return isTestUser === 'true' ? true : false;
  })
  .catch(err => {
    consoleLog('error -' + err);
    return {error:err, response: null};
  });

}尝试返回一个新的承诺

导出函数isMock(){
返回新承诺((解决、拒绝)=>{
getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER)。然后(isTestUser=>{
consoleLog('isMock-'+isTestUser);
解析(isTestUser=='true'?true:false)
}).catch(错误=>{
控制台日志(“错误-”+错误);
拒绝(错误)
})
})

}
尝试返回新承诺

导出函数isMock(){
返回新承诺((解决、拒绝)=>{
getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER)。然后(isTestUser=>{
consoleLog('isMock-'+isTestUser);
解析(isTestUser=='true'?true:false)
}).catch(错误=>{
控制台日志(“错误-”+错误);
拒绝(错误)
})
})


}
我也尝试过这个,但也不起作用,但会再次尝试,但没有起作用@Varun The Falconokay,这个fn GetSharedReferenceValue的本质是什么。。。这是承诺吗?或者需要回电话吗?我也试过了,但也没用,但会再次尝试,但没用@Varun The Falconokay,这个fn GetSharedReferenceValue的本质是什么。。。这是承诺吗?或者它需要回调吗?Hello@Sanyam确实修复了函数的该部分,但错误来自另一个函数。这些承诺现在让我更加困惑。我更新了一点我的问题,你能看一下吗?你好@Sanyam Jain我更新了一点我的问题。您的解决方案解决了部分问题,但错误来自登录函数hello@Sanyam,该函数确实修复了该部分问题,但错误来自另一个函数。这些承诺现在让我更加困惑。我更新了一点我的问题,你能看一下吗?你好@Sanyam Jain我更新了一点我的问题。您的解决方案解决了部分问题,但错误来自登录功能。因此,我们建议您做什么?我们建议您做什么?您的
Login
功能与您的
isMock
功能存在相同的问题。它不返回任何内容。此行是否
返回承诺。解析(用户)没有返回它吗?不,该行位于内部函数中,该函数在登录函数完成后很久才会执行。。
login
函数本身没有
return
语句。您的
login
函数具有与
isMock
函数相同的问题。它不返回任何内容。此行是否
返回承诺。解析(使用