Javascript 如何处理承诺
我对承诺有问题,我编写了一个函数,尝试从共享首选项获取数据,一旦收到,我将返回一个Javascript 如何处理承诺,javascript,reactjs,react-native,promise,Javascript,Reactjs,React Native,Promise,我对承诺有问题,我编写了一个函数,尝试从共享首选项获取数据,一旦收到,我将返回一个承诺。 在我使用的函数中,它返回未处理的承诺拒绝无法读取未定义的属性 下面是我的函数,它从共享首选项获取数据并返回一个承诺 export function isMock(){ const returned = getSharedPreferenceValue( Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {
承诺
。
在我使用的函数中,它返回未处理的承诺拒绝无法读取未定义的属性
下面是我的函数,它从共享首选项获取数据并返回一个承诺
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) => {
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));
});
}
这里是我尝试使用上述函数的函数
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在这里被调用,issue在else语句中,它返回一个承诺
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) => {
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)
总是返回一个已解析的
(虽然是用true
或false
解析的),因此永远不会进入catch(它也是异步的,因此不会实际返回)
编辑,可能的操作:
export function isMock(){
return new Promise((res,rej)=> {
getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {
res(isTestUser === 'true')
}).catch(rej)
}
}
一个新的承诺得到了回报;这将getSharedReferenceValue
,如果成功,则用您的答案解决新承诺。如果此操作失败,请将错误传递到拒绝函数,该函数也将传递回将捕获它的调用方。我想,您是否在isMock()
中返回returned
因此,尽管在catch
中返回{error:err,response:null}
,但实际上从未得到错误,因为您是return Promise.resolve(isTestUser=='true'?true:false)
总是返回一个已解析的
(虽然是用true
或false
解析的),因此永远不会进入catch(它也是异步的,因此不会实际返回)
编辑,可能的操作:
export function isMock(){
return new Promise((res,rej)=> {
getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER).then ((isTestUser) => {
res(isTestUser === 'true')
}).catch(rej)
}
}
一个新的承诺得到了回报;这将getSharedReferenceValue
,如果成功,则用您的答案解决新承诺。如果此操作失败,请将错误传递到拒绝函数,该函数也将传递回将捕获它的调用方。看起来该函数应该是GetSharedReferences()而不是GetSharedReferencesValue()看起来该函数应该是GetSharedReferences()而不是GetSharedReferencesValue()您不必使用Promise.resolve,因为getSharedPreferenceValue本身就是一个Promise。。。您可以尝试只返回值
此外,您不应按照以下要求解析可启用函数中的承诺:
您可以尝试这种方法,也可以简单地使用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};
});
}您不必使用Promise.resolve,因为getSharedPreferenceValue本身就是一个Promise。。。您可以尝试只返回值
此外,您不应按照以下要求解析可启用函数中的承诺:
您可以尝试这种方法,也可以简单地使用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};
});
}尝试返回一个新的承诺
导出函数isMock(){
返回新承诺((解决、拒绝)=>{
getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER)。然后(isTestUser=>{
consoleLog('isMock-'+isTestUser);
解析(isTestUser=='true'?true:false)
}).catch(错误=>{
控制台日志(“错误-”+错误);
拒绝(错误)
})
})
}
尝试返回新承诺
导出函数isMock(){
返回新承诺((解决、拒绝)=>{
getSharedPreferenceValue(Globals.SHARED_PREFERENCES_KEY_IS_TEST_USER)。然后(isTestUser=>{
consoleLog('isMock-'+isTestUser);
解析(isTestUser=='true'?true:false)
}).catch(错误=>{
控制台日志(“错误-”+错误);
拒绝(错误)
})
})
}
我也尝试过这个,但也不起作用,但会再次尝试,但没有起作用@Varun The Falconokay,这个fn GetSharedReferenceValue的本质是什么。。。这是承诺吗?或者需要回电话吗?我也试过了,但也没用,但会再次尝试,但没用@Varun The Falconokay,这个fn GetSharedReferenceValue的本质是什么。。。这是承诺吗?或者它需要回调吗?Hello@Sanyam确实修复了函数的该部分,但错误来自另一个函数。这些承诺现在让我更加困惑。我更新了一点我的问题,你能看一下吗?你好@Sanyam Jain我更新了一点我的问题。您的解决方案解决了部分问题,但错误来自登录函数hello@Sanyam,该函数确实修复了该部分问题,但错误来自另一个函数。这些承诺现在让我更加困惑。我更新了一点我的问题,你能看一下吗?你好@Sanyam Jain我更新了一点我的问题。您的解决方案解决了部分问题,但错误来自登录功能。因此,我们建议您做什么?我们建议您做什么?您的Login
功能与您的isMock
功能存在相同的问题。它不返回任何内容。此行是否返回承诺。解析(用户)登录中的code>没有返回它吗?不,该行位于内部函数中,该函数在登录函数完成后很久才会执行。。login
函数本身没有return
语句。您的login
函数具有与isMock
函数相同的问题。它不返回任何内容。此行是否返回承诺。解析(使用