JavaScript Promise使用疑问:axios请求后response_status变量不更新如何解决?
问题原因
axios发送请求是异步操作,JS主线程不会等待请求返回结果再执行后续代码:
- 你定义的
response_status初始值为true - 执行到
axios.post时,请求会被放到后台执行,主线程会直接继续往下走,走到最后return response_status - 等到请求返回触发
then/catch回调时,函数早就已经返回结果了,此时修改response_status已经不会影响之前的返回值,所以你拿到的永远是初始的true。
修复方案
现在主流方案是用async/await语法处理异步逻辑,可读性更高,修改后的代码如下:
import axios from 'axios/dist/axios.min.js'; // 给函数添加async关键字标记为异步函数 async function addOrRemoveFavourite(variation_id, isFav) { let response_status = true; if (typeof variation_id == 'undefined' || typeof isFav == 'undefined') { return false; } const data = { product_variation: variation_id }; try { // 用await等待请求执行完成,再走后续逻辑 if (isFav) { await axios.post('/api/product/remove-from-favourite', data); } else { await axios.post('/api/product/add-to-favourite', data); } } catch (error) { if (error.response) { alert(error.response.data.message); response_status = false; } } return response_status; } // 调用时需要用await(外层必须也是async函数)或者then回调拿结果 // 方式1:async/await调用 async function handleFav() { const response = await addOrRemoveFavourite(49, true); console.log(response); // 此时可以拿到正确的状态 } handleFav(); // 方式2:then回调调用 addOrRemoveFavourite(49, true).then(response => { console.log(response); });
内容的提问来源于stack exchange,提问作者Sadriddin
相关产品推荐
相关产品推荐

