.catch() 甚至通过 fetch() 从另一个承诺中捕获所有错误

Posted

技术标签:

【中文标题】.catch() 甚至通过 fetch() 从另一个承诺中捕获所有错误【英文标题】:.catch() is catching all errors even from another promise by fetch() 【发布时间】:2018-06-29 03:12:57 【问题描述】:

我创建了一个简单的函数来通过用户存储的令牌对用户进行身份验证,该函数基于一个承诺,如果成功连接到我们的服务器 API,则返回带有用户详细信息的响应,如果有服务器连接,它将返回通过 React-native fetch 方法进行的带有指定错误的 promise 拒绝。

import React,  Component  from 'react';
import 
    Text,
    View,
    Alertios,
 from 'react-native';

function AuthAPI(token)

    return new Promise((resolve, reject) => 
        fetch("https://myawesomeapi.com/auth", 
            method: "POST",
            body: '"token": "' + token + '"',
        )
        .then((response) => response.json())
        .then((response) => 
            resolve(response);
        )
        .catch((error) => 
            reject(error);
        );
    );


export default class Home extends Component

    constructor(props)
    
        super(props);
        this.state = 
            bodyMessage: 'Waiting for response!',
        ;
    

    componentWillMount()
    
        AuthAPI("token-here")
        .then((response) => 
            const justAnotherVar = iamNotExist; // this will throw an error in next .catch
            AlertIOS.alert("Your Name: " + response.userFullName);
            this.setState(bodyMessage: 'Fetch is done with a response!');
        )
        .catch((error) => 
            console.err(error);
        );
    

    render()
    
        const  bodyMessage  = this.state;
        return (
            <View style=
                flex: 1,
                justifyContent: 'center',
                alignItems: 'center',
            >
                <Text>Welcome..</Text>
                <Text>bodyMessage</Text>
            </View>
        );
    

问题说明:

AuthAPI.then(/***/) 中出现错误时,AuthAPI.catch 将捕获它,但据我所知,AuthAPI.catch 只会捕获由 react-native fetch 方法返回的错误,该错误来自该承诺拒绝。

例如,在AuthAPI.then 中,我将一个未定义的变量分配给了一个新的常量变量const justAnotherVar = iamNotExist;,这样在下一个catch 中就会抛出一个错误。

ReferenceError: Can't find variable: iamNotExist

我想要的是保持AuthAPI.catch 仅获取获取方法错误,并在AuthAPI.then(/***/) 内部出现错误时获得带有指定错误的常规红屏

【问题讨论】:

您可以检查您的 catch 中的错误是否是 ApiError 的实例,否则抛出剩余的错误 谢谢@ShubhamKhatri,只是您的评论有点难以理解。Matt Aft 的回答非常适合我的情况 【参考方案1】:

我相信这是有意为之,请在此处阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Promise/catch

您可以做的是添加一个 try/catch,以便 .then 语句有自己的错误处理,并且在出现问题时不会触发 .catch:

  AuthAPI("token-here")
    .then((response) => 
        try 
          const justAnotherVar = iamNotExist; // this will throw an error in next .catch
          AlertIOS.alert("Your Name: " + response.userFullName);
          this.setState(bodyMessage: 'Fetch is done with a response!');
         catch (e) 
          //error handling
        
    )
    .catch((error) => 
        console.err(error);
    );

【讨论】:

以上是关于.catch() 甚至通过 fetch() 从另一个承诺中捕获所有错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一台计算机连接到JavaDB?

FreeSWITCH:有没有办法通过本机 API 从另一条腿获取音频流

fetch 在测试环境中从不调用 .then 或 .catch

如何通过 odbc_connect() 从另一台计算机连接到 Microsoft Access 数据库?

如何通过 laravel 应用程序使用数字海洋服务器从另一台服务器在远程服务器上运行脚本文件

从另一个方法将子视图添加到子视图