Как справиться с обещаниями - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблема с 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 вызывается здесь и выдает ошибкунаходится в другом операторе, который возвращает обещание

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

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Попробуйте вернуть новое обещание.

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);
      });
  });
}
0 голосов
/ 19 февраля 2019

Похоже, что функция должна быть getSharedPreferences (), а не getSharedPreferencesValue ()

0 голосов
/ 19 февраля 2019

вам не нужно использовать Promise.resolve, так как само getSharedPreferenceValue является обещанием ... вы можете попытаться вернуть только значения ....

также вы не должны разрешать обещание внутри доступного объектафункционировать согласно документации

, вы можете попробовать этот способ или просто использовать 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};
  });

}

0 голосов
/ 19 февраля 2019

Я думаю, вы не возвращаете returned в isMock()?

Так что, хотя в catch вы возвращаете {error:err, response: null}, вы на самом деле никогда не получите ошибку, поскольку return Promise.resolve(isTestUser === 'true' ? true : false);, котораявсегда возвращает resolved (хотя и разрешается с помощью true или false) и, таким образом, никогда не попадает в улов (который также асинхронный, поэтому не возвращается)

edit, возможно, что делать:

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(), которая будет ее перехватывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...