You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo React Native iOS发布版调用AbortController.abort后崩溃求助

修复Expo iOS发布版中fetch abort导致的崩溃问题

问题分析

在Expo React Native的iOS发布版中,调用AbortController.abort()会导致应用无错误崩溃,但开发环境正常。这通常是因为iOS发布版中fetch的AbortController实现存在兼容性问题,或未正确处理中止请求时抛出的AbortError。

修复方案

方案1:显式捕获并处理AbortError

在catch块中明确判断错误类型,避免未处理的异常触发崩溃:

const controller = new AbortController();
const { signal } = controller;

fetch('xxxxxxxxx/system/sleep3000ms', { signal }) 
    .then(async r => {
        const rr = await r.json(); 
        console.log(rr);
    }) 
    .catch(error => {
        // 明确捕获AbortError,避免崩溃
        if (error.name === 'AbortError') {
            console.log('请求已中止');
            return;
        }
        console.error('请求出错:', error);
    });

setTimeout(() => { 
    console.log('abort');
    controller.abort();
}, 1000);

方案2:使用axios替代原生fetch

axios的取消请求机制在Expo iOS发布版中兼容性更稳定,实现方式如下:

import axios from 'axios';

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('xxxxxxxxx/system/sleep3000ms', {
    cancelToken: source.token
})
.then(response => {
    console.log(response.data);
})
.catch(error => {
    if (axios.isCancel(error)) {
        console.log('请求已中止:', error.message);
    } else {
        console.error('请求出错:', error);
    }
});

setTimeout(() => {
    console.log('abort');
    source.cancel('主动中止请求');
}, 1000);

使用前需安装axios:npm install axios或yarn add axios

方案3:升级Expo SDK版本

部分旧版Expo SDK的iOS打包存在AbortController的bug,升级到最新稳定版(如SDK 49+)可解决此类兼容性问题。

注意事项

  • 测试时务必使用expo build:ios生成发布版包进行验证,开发环境无法复现该问题

内容的提问来源于stack exchange,提问作者lacaci3709

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:35:00