如何履行承诺

时间:2019-02-19 11:45:45

标签: javascript reactjs react-native promise

我在Promises上遇到问题,编写了一个函数,该函数试图从“共享”首选项中获取数据,一旦收到该函数,我将返回Promise。    在我正在使用的函数中,它返回Unhandled promise rejection cannot read the property then of undefined

这是我的函数,该函数从共享的首选项中获取数据并返回一个诺言

  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语句中,该语句返回一个诺言

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

Login的主要调用功能在这里,给我错误

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

  }

谢谢 R

4 个答案:

答案 0 :(得分:1)

我认为,您不是要在returned中返回isMock()吗?

因此,尽管在catch中返回{error:err, response: null},但实际上并没有收到像return Promise.resolve(isTestUser === 'true' ? true : false);这样的错误,它总是返回resolved(尽管用{{ 1}}或true),因此永远不会进入陷阱(这也是异步的,因此不会准确返回)

编辑,可能的操作:

false

}

返回了新的承诺;如果成功,将export function isMock(){ return new Promise((res,rej)=> { getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => { res(isTestUser === 'true') }).catch(rej) } ,然后用您的答案解决新的承诺。如果失败,则将错误传递到拒绝函数,该函数还将传递回getSharedPreferenceValue调用方,该调用方将捕获该错误。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

您也不应按照documentation

在可实现的函数中解析Promise

您可以尝试这种方式,也可以只使用async / await

'once'

}

答案 3 :(得分:0)

尝试返回新的Promise。

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(user)仅在此范围ismock()中返回promise。

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

要解决此问题,请返回一个新的Promise。

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