为何变量‘status’始终保持为‘pending’?技术咨询
问题原因与解决办法
核心原因
你看到status一直是pending,本质是Promise回调的异步执行特性导致的:
api()返回的是Promise对象,.then()里的成功/失败回调不会同步执行,必须等API请求完成(成功或失败)后才会触发。- 如果你在定义
suspender后立刻同步读取status(比如直接打印),此时异步回调还没执行,status还是你初始化时的pending值。
解决方法
方法1:把依赖status的逻辑放到回调内部
将需要使用status或result的代码,直接写在.then()/.catch()的回调函数里,确保逻辑在异步操作完成后执行:
let status = 'pending'; let result = null; api({ url: 'https://data.etabus.gov.hk/v1/transport/kmb/route-stop/7/inbound/1', method: 'get', }).then( (r) => { console.log("r", r); status = 'success'; result = r.data; // 在这里处理成功后的业务逻辑 console.log(status); // 此时输出success }, (e) => { status = 'error'; result = e; // 在这里处理错误逻辑 console.log(status); // 此时输出error } );
方法2:用async/await简化异步逻辑
通过async函数包裹代码,用await等待Promise完成,让异步代码看起来像同步代码,更直观:
async function fetchBusData() { let status = 'pending'; let result = null; try { const r = await api({ url: 'https://data.etabus.gov.hk/v1/transport/kmb/route-stop/7/inbound/1', method: 'get', }); status = 'success'; result = r.data; console.log(status); // 输出success } catch (e) { status = 'error'; result = e; console.log(status); // 输出error } } fetchBusData();
内容的提问来源于stack exchange,提问作者The KNVB
相关产品推荐
相关产品推荐

