JS新手求助:如何基于异步函数结果用SweetAlert生成站点动态按钮?
解决SweetAlert动态创建邻居站点按钮的问题
嘿,作为JavaScript新手碰到异步和UI组件结合的问题太正常了,我来帮你梳理下代码里的问题并给出修复方案:
原代码的核心问题
- 异步流程顺序错了:你在
GetAllNeighboors的回调外面就执行了循环,这时候Vecini还没被异步请求的结果赋值,循环根本不会运行 - 循环变量写错了:循环里写了
v++而不是i++,而且用var会导致闭包问题,点击按钮时i已经是最后一个值 - SweetAlert配置语法错误:
onBeforeOpen是Swal.fire的配置项之一,不能写在外面;同时按钮的HTML标签没闭合,属性引号也没正确处理 - 事件绑定逻辑不对:你试图直接给
v[i].id绑定事件,但这个变量根本不存在,应该通过DOM选择器获取按钮元素
修复后的完整代码
// 先优化GetAllNeighboors函数,用Promise替代回调(更符合现代JS异步写法) async function GetAllNeighboors(myLocationLat, myLocationLong) { return new Promise((resolve) => { $.get("/Home/GetAllLocation", function (data, status) { const neighbours = data.filter(item => { // 用filter更简洁,替代手动循环push const distance = distanceBetweenTwoStations( myLocationLat, myLocationLong, item.latitudine, item.longitudine, "K" ); return distance <= 1 && item.latitudine !== myLocationLat && item.longitudine !== myLocationLong; }); resolve(neighbours); }); }); } // SweetAlert的调用逻辑 ]).then((result) => { if (result.value) { // 等待异步获取邻居数据后再处理弹窗 GetAllNeighboors(data.latitudine, data.longitudine) .then(neighbours => { if (neighbours.length === 0) { Swal.fire("提示", "没有找到附近的站点", "info"); return; } // 构建所有按钮的HTML let buttonsHtml = ""; neighbours.forEach(station => { buttonsHtml += `<button id="station-btn-${station.id}" class="btn btn-success m-1">${station.name}</button>`; }); // 创建SweetAlert弹窗 Swal.fire({ title: '附近的自行车站点', html: buttonsHtml, backdrop: `rgba(0,0,123,0.4)`, onBeforeOpen: () => { // 给每个按钮绑定点击事件 neighbours.forEach(station => { const btn = document.getElementById(`station-btn-${station.id}`); btn.addEventListener('click', () => { GoToLocation(station.id); Swal.close(); // 点击后关闭弹窗,体验更好 }); }); } }); }) .catch(err => { Swal.fire("错误", "获取站点数据失败", "error"); console.error(err); }); } });
关键修复说明
- 异步逻辑优化:把原来的回调式异步改成Promise,用
.then()确保拿到数据后再处理弹窗,彻底解决了异步时序问题 - HTML构建优化:用
forEach循环构建所有按钮的HTML,确保标签闭合、属性引号正确,还加了margin样式让按钮排版更美观 - 事件绑定正确:在
onBeforeOpen里通过ID获取每个按钮,然后绑定点击事件,用forEach的块级作用域避免了闭包变量问题 - 异常处理:增加了无数据和请求失败的提示,提升了整体用户体验
这样修改后,就能正确显示所有邻居站点的按钮,点击按钮也能触发GoToLocation函数实现定位缩放啦~
内容的提问来源于stack exchange,提问作者seceneu
相关产品推荐
相关产品推荐

