如何将AngularJS的Promise链式调用逻辑正确迁移适配到VueJS
原有实现错误排查
- 两个版本的核心逻辑错误:完全没有实现
config.skip的判断分支,一上来就创建了立即reject的Promise实例,且强制设置returnEarly=true,导致永远直接返回reject状态的跳过提示,和原AngularJS逻辑完全不符 - 语法错误:多处遗漏括号、将分号写为冒号,导致代码执行异常
- 错误处理缺失:axios请求没有添加catch分支,请求失败(如404)时会抛出未捕获的Promise异常
- 方案2额外问题:后续逻辑挂载在从未resolve的初始Promise的then回调中,导致逻辑永远不会执行,测试时触发超时
正确迁移实现
var foo = function(obj, config) { // 对齐原逻辑:skip为true时直接返回reject的Promise if (config.skip) { return Promise.reject("Skipping"); } // 创建Promise实例,挂载到obj上,对齐原deferred.promise赋值逻辑 const promise = new Promise((resolve, reject) => { if (obj.hasValue()) { resolve(obj); return; } // 调用接口,处理返回结果 axios.get("/api/callToApi") .then(function(res) { if (res) { resolve(res); } else { reject(res); } }) // 补充请求错误捕获,避免未捕获的Promise异常 .catch(function(err) { reject(err); }); }); obj.promise = promise; return promise; }
注意事项
如果你的jest测试中没有mock axios请求,需要补充对应接口的mock逻辑,避免真实请求触发404或者超时问题。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

