我对承诺有一个问题,我已经执行了一个函数,该功能试图从共享的偏好中获取数据,并且一旦收到它,我就会返回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
(尽管使用true
或false
解决),因此永远不会进入捕获量(也永远不会陷入困境(也是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);
});
});
}