Ajax请求响应后then方法未触发,Bootstrap popover无法弹出问题排查
问题排查与修复方案
存在的问题
- 未定义变量导致Promise被拒绝
你在$.ajax配置中写了data: data,但代码中没有定义data变量,请求发送前就会抛出ReferenceError,导致返回的Promise进入rejected状态,你没有绑定错误回调,所以then的成功回调不会执行,错误也不会默认在控制台打印。 then回调内的this指向错误then里的普通函数默认this指向全局对象(浏览器中为window),不是触发mouseover的.my-link-popup元素,就算then执行也找不到对应元素弹出popover。- 混用success回调与Promise链式调用(非致命但不规范)
$.ajax返回的jqXHR对象本身符合Promise A+规范,请求成功后响应数据会直接传给then的第一个回调,不需要额外写success回调return数据,混用两种异步处理方式容易造成逻辑混乱。 - popover配置中变量没有正确插值
你写的title: "<span>x.displayName</span>"是普通字符串,不会解析x.displayName的变量值,只会原样输出文本。 - 重复初始化popover会导致异常
每次触发mouseover都调用$(this).popover()初始化组件,重复初始化会导致Bootstrap popover出现行为异常。 - 额外注意:
getUserProfile定义时接收的参数是email,但调用时传入的是this.href(触发元素的完整链接地址),请确认接口参数是否匹配,避免传参错误。
修复后完整代码
function getUserProfile(email){ return $.ajax({ url: my_url + email, method: 'GET', async: true // 移除了未定义的data参数,如果确实需要传参请先定义data变量 }); } // 替换为mouseenter避免子元素冒泡重复触发 $(".my-link-popup").off('mouseenter').on('mouseenter', function (){ // 提前保存触发元素引用,解决this指向问题 const $triggerEl = $(this); // 已初始化过popover直接弹出,避免重复请求 if($triggerEl.data('bs.popover')) { $triggerEl.popover('show'); return; } getUserProfile(this.href) .then(function(x){ console.log(x); // 用模板字符串解析变量 $triggerEl.popover({ html: true, title: `<span>${x.displayName}</span>`, content: "Some nice content" }); $triggerEl.popover('show'); }) // 新增错误回调方便调试 .catch(function(err){ console.error('请求用户信息失败:', err); }); })
内容的提问来源于stack exchange,提问作者user3437721
相关产品推荐
相关产品推荐

