Javascript 如何包装来自第三方api的错误?
我确实使用第三方API来管理身份验证操作 可用方法返回承诺,假设一个Javascript 如何包装来自第三方api的错误?,javascript,Javascript,我确实使用第三方API来管理身份验证操作 可用方法返回承诺,假设一个createUser方法,我可以这样调用它: this.auth.createUser(data).then(() => alert('user created')); 好的,到目前为止 如果我确实发送了无效数据,或者如果我打破了一些先决条件,API就会抛出一些包含大量数据和信息的大错误。问题是这些错误对用户不友好 我正在尝试包装这些方法,这样我就可以抛出一个已知的错误(特定的标记),并向用户提供更好的消息,但到目前为止
createUser
方法,我可以这样调用它:
this.auth.createUser(data).then(() => alert('user created'));
好的,到目前为止
如果我确实发送了无效数据,或者如果我打破了一些先决条件,API就会抛出一些包含大量数据和信息的大错误。问题是这些错误对用户不友好
我正在尝试包装这些方法,这样我就可以抛出一个已知的错误(特定的标记),并向用户提供更好的消息,但到目前为止我还无法做到这一点
我构建了以下代码段:
类身份验证{
createUser(…args){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
此.log(…args);
抛出新错误(“身份验证服务抛出一些错误,其中包含大量不友好的细节和信息”);
}, 3000);
});
}
log(…args){console.log('this',…args)}
}
const auth=new auth();
Object.keys(auth.forEach)(key=>{
if(验证[键]的类型='函数'){
const originalFunction=auth[key];
auth[key]=函数(){
试一试{
返回originalFunction.apply(这是参数);
}捕获(e){
此.log('error',e);
抛出新错误('Error-auth-'+namefunctionstag(key));
}
};
}否则{
console.log(type of auth[key]);
}
});
函数名FunctionStag(名称){
返回name.replace(/(?!^[A-Z]/g,c=>'-'+c.toLowerCase());
}
身份验证日志(“身份验证服务”);
auth.createUser(1,2,3,4,5);
//应为:错误身份验证创建用户
//已接收:身份验证服务抛出一些错误,其中包含大量不友好的详细信息和信息使用承诺中的resolve和reject 这里(您的代码): 您可以做什么:
function asyncError(){
return new Promise(function(resolve, reject){
// ... code
reject(new Error('Error ...'));
// ... code
})
}
async function test(){
try{
const experiment = await asyncError();
}
catch(e){
console.log(e)
}
}
其他方式(无需等待即可捕获):
在承诺中使用决心和拒绝 这里(您的代码): 您可以做什么:
function asyncError(){
return new Promise(function(resolve, reject){
// ... code
reject(new Error('Error ...'));
// ... code
})
}
async function test(){
try{
const experiment = await asyncError();
}
catch(e){
console.log(e)
}
}
其他方式(无需等待即可捕获):
当您注册一个承诺,甚至一个setTimeout时,您并不是在同一堆栈上下文中调用该函数。实际上,您是在告诉引擎注册回调,系统将在稍后使用正确的参数调用它。正因为如此,错误永远不会出现在try/catch中。您可以在异步函数中使用await关键字来暂停执行并在稍后返回,从而维护相同的上下文,这将保留此处使用的try/catch块。这就是你在这里需要做的。签出:当您注册承诺,甚至setTimeout时,您并不是在同一堆栈上下文中调用该函数。实际上,您是在告诉引擎注册回调,系统将在稍后使用正确的参数调用它。正因为如此,错误永远不会出现在try/catch中。您可以在异步函数中使用await关键字来暂停执行并在稍后返回,从而维护相同的上下文,这将保留此处使用的try/catch块。这就是你在这里需要做的。签出:刚刚发现了主要问题:
Object.keys(auth)
在类实例上返回空数组
在将其更改为Object.getOwnPropertyNames(Object.getPrototypeOf(auth))
之后,我可以专注于你们帮助我的承诺:)
我的最后一个工作片段是这样结束的:
this.auth.createUser(data).then(() => alert('user created'));
类身份验证{
createUser(…args){
返回Promise.resolve()。然后(()=>{
此.log(…args);
抛出新错误(“身份验证服务抛出一些错误,其中包含大量不友好的细节和信息”);
});
}
log(…args){console.log('this',…args)}
}
const auth=new auth();
Object.getOwnPropertyNames(Object.getPrototypeOf(auth)).forEach(key=>{
if(key=='constructor')返回;
if(验证[键]的类型='函数'){
const originalFunction=auth[key];
auth[key]=函数(){
返回承诺。解决()
.then(()=>originalFunction.apply(这个,参数))
.catch(e=>{
此.log('error',e.message);
抛出新错误('Error-auth-'+namefunctionstag(key));
});
};
}
});
函数名FunctionStag(名称){
返回name.replace(/(?!^[A-Z]/g,c=>'-'+c.toLowerCase());
}
身份验证日志(“身份验证服务”);
auth.createUser(1,2,3,4,5).catch(e=>console.log('final error:',e.message))代码>刚刚发现了主要问题:
Object.keys(auth)
在类实例上返回空数组
在将其更改为Object.getOwnPropertyNames(Object.getPrototypeOf(auth))
之后,我可以专注于你们帮助我的承诺:)
我的最后一个工作片段是这样结束的:
this.auth.createUser(data).then(() => alert('user created'));
类身份验证{
createUser(…args){
返回Promise.resolve()。然后(()=>{
此.log(…args);
抛出新错误(“身份验证服务抛出一些错误,其中包含大量不友好的细节和信息”);
});
}
log(…args){console.log('this',…args)}
}
const auth=new auth();
Object.getOwnPropertyNames(Object.getPrototypeOf(auth)).forEach(key=>{
if(key=='constructor')返回;
if(验证[键]的类型='函数'){
const originalFunction=auth[key];
auth[key]=函数(){
返回承诺。解决()
.then(()=>originalFunction.apply(这个,参数))
.catch(e=>{
此.log('error',e.message);
抛出新错误('Error-auth-'+namefunctionstag(key));
});
};
}
});
函数名FunctionStag(名称){
返回name.replace(/(?!^[A-Z]/g,c=>'-'+c.toLowerCase());
}
身份验证日志(“身份验证服务”);
auth.createUser(1,2,3,4,5).catch(e=>console.log('final error:',e.message))代码>setTimeout中的抛出与抛出i的上下文不同