如何处理承诺



我对承诺有一个问题,我已经执行了一个函数,该功能试图从共享的偏好中获取数据,并且一旦收到它,我就会返回Promise。 在功能中,我正在使用它返回Unhandled promise rejection cannot read the property then of undefined

这是我的功能,它从共享的偏好中获取数据并返回Promise

  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) => {
        //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在此处调用,并且在ELSE语句中发出问题,该声明返回了Promise

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);,它总是返回resolved(尽管使用truefalse解决),因此永远不会进入捕获量(也永远不会陷入困境(也是Async So async So so so so isnc so isn't a aacccccccccctally返回)

编辑,可能要做什么:

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

}

返回一个新的承诺;这将是getSharedPreferenceValue,如果成功,请通过您的答案解决新的承诺。如果失败,请将错误传递到拒绝函数中,该函数还将回到isMock()呼叫者。

看起来该函数应该是getSharedPreferences()not getSharedPreferencesValue()

您不必使用Promise.resolve。由于GetSharedPreferenceValue本身就是一个承诺...您可以尝试仅返回值....

您也不应根据文档在当时的函数内解决诺言

您可以这样尝试,也可以简单地使用异步/等待

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};
  });

}

尝试返回新的承诺。

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)
    })
  })
}

- 更新 -

Promise.resolve(用户)将仅返回此范围的承诺,这是Ismock()。

export function login ( ABCD, XYZ ){
  const returned = isMock().then((isMock) => {
      consoleLog('login Legacy API - isMock() - ' + isMock);
      if(!isMock){
          console.log('isMock is false');
      }else{
          consoleLog('mock data - ../mockData/login.json');
          var user = require('../mockData/login.json');
          return Promise.resolve(user); // This line will return Promise for this scope only (isMock function)
      }
  })
  .catch(error => {
        console.log('Login isMock - error - ' + JSON.stringify(error));
    });
}

要解决此问题,请返回新的承诺。

export function login(ABCD, XYZ) {
  return new Promise((resolve, reject) => {
    isMock()
      .then((isMock) => {
        consoleLog(`login Legacy API - isMock() - ${isMock}`);
        if (!isMock) {
          consoleLog('isMock is false');
        } else {
          consoleLog('mock data - ../mockData/login.json');
          const user = require('../mockData/login.json');
          resolve(user);
        }
      })
      .catch((error) => {
        consoleLog(`Login isMock - error - ${JSON.stringify(error)}`);
        reject(error);
      });
  });
}

相关内容

  • 没有找到相关文章

最新更新