如何在获取承诺中的错误时捕获网络错误

Posted

技术标签:

【中文标题】如何在获取承诺中的错误时捕获网络错误【英文标题】:How to catch the network error while fetching the error in promise 【发布时间】:2016-12-20 03:38:28 【问题描述】:

所以我有这个 Picker 组件,对于项目,我从服务器获取数据并在状态更改时映射它。

//api.js
var api = 
    getBooks() 
        var url = 'http://192.168.43.14:8080/api/books/'
        var headers = new Headers();
        headers.append('Accept', 'application/json');
        return fetch(url, headers)
            .then((res) => res.json())  
            .catch(function(err)   
                console.log('Fetch Error :-S', err);
                throw Error(err);
            );
    


//RegisterMobile.js
import api from '../utilities/api'

export default class RegisterMobile extends Component 
    constructor(props) 
        super(props)
        this.state = 
            books: [],
            book: '',
            mobile: '',
            displayError: false,
            error: 'Please provide a valid mobile number'
        
    

    componentWillMount() 
        api.getBooks().then((res) => 
            this.setState(
                books: res
            )
        )
    

    render() 
        return(
            <View>
                <View style=styles.selecBook>
                    <Picker selectedValue=this.state.book onValueChange=this.changeBook>
                        this.state.books.map((book) => return <Picker.Item value=book.name label=book.name key=book.id  />)
                    </Picker>
                </View>
                this.state.displayError ? <Text style=styles.error>this.state.error</Text> : null
            </View>
        )
    

这工作正常。我得到了项目列表,当我点击 Picker 时,我可以选择项目。我想要做的是,如果在获取数据时出现任何错误(例如服务器已关闭),我想获取该错误并将其显示为错误(这将只是更改 error 和 @ 987654323@)。但是如果有一个将其设置为错误状态,我不知道如何获取错误。

【问题讨论】:

api.getBooks().then((res) =&gt; this.setState( books: res ).catch(e =&gt; this.setState( displayError: true )? @guest271314 嗨!我试过你的方法,但它给了我这个错误:Possible Unhandled Promise Rejection (id: 0): this.setState is not a function TypeError: this.setState is not a function 呃,你已经证明你知道如何在你的 API 中catch(并重新抛出)错误,那么为什么它在组件中会有任何不同(除此之外你不会重新扔在那里)? 【参考方案1】:
componentWillMount() 
    api.getBooks()
       .then((res) =>  this.setState(books: res) )
       .catch(function(err)   
            if (err.message === 'Network Error') 
                // This is a network error.
            
        );

【讨论】:

【参考方案2】:

不要在 api 中捕获错误。在要使用异步操作结果的地方执行此操作。像这样的...

//api.js
var api = 
    getBooks() 
        var url = 'http://192.168.43.14:8080/api/books/'
        var headers = new Headers();
        headers.append('Accept', 'application/json');
        return fetch(url, headers)
            .then((res) => res.json());

    


//RegisterMobile.js
import api from '../utilities/api'

export default class RegisterMobile extends Component 
    constructor(props) 
        super(props)
        this.state = 
            books: [],
            book: '',
            mobile: '',
            displayError: false,
            error: 'Please provide a valid mobile number'
        
    

    componentWillMount() 
        api.getBooks()
           .then((res) =>  this.setState(books: res) )
           .catch(function(err)   
                console.log('Fetch Error :-S', err);
                this.setState(books: [], book: null, displayError: true, error:err);
            );
    

【讨论】:

完美!非常感谢! 这也会触发来自服务器的非 200 错误消息。看到这个***.com/a/64303974/1923625

以上是关于如何在获取承诺中的错误时捕获网络错误的主要内容,如果未能解决你的问题,请参考以下文章

复杂承诺返回链中的承诺 catch() 顺序

未捕获(承诺)类型错误:尝试打开窗口时出现问题

如何解决反应身份验证中的未捕获(承诺中)TypeError?

未捕获(在承诺中)错误:提供的权重数据没有目标变量:block1_conv1_2 / kernel

如何捕获异步非承诺错误? (对特定错误做出反应)

GraphQL + Apollo 错误:未捕获(承诺中)