我在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
答案 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);
});
});
}