Backbone.js项目中jQuery $get修改变量后外部取旧值问题求助
解决Backbone.js中$.get异步修改变量后外部获取旧值的问题
嘿,这个问题我太熟悉了——本质上是AJAX异步执行机制在搞鬼!咱们一步步拆解问题,再给你可行的解决思路:
问题根源
你用的$.get是jQuery的异步AJAX请求方法,代码执行顺序并不是你直觉里的“从上到下同步完成”:
- 当代码走到
$.get这一行时,浏览器会发起HTTP请求,但不会等着请求完成,而是直接跳过去执行后面的代码(包括你那行console.log(cityValue)) - 只有当服务器返回响应、AJAX请求成功时,才会执行
$.get的回调函数,这时候才会修改cityValue——但这时候你早就已经打印过旧值了!
具体解决办法
方法1:把依赖更新后变量的逻辑放进回调函数里
这是最直接的方案,既然只有回调里能拿到最新的cityValue,那所有需要用这个值的操作都得放在回调内部:
getFormattedAddress1: function () { var postalCodeValue = this.model.get(this.postalCodeField); var streetValue = this.model.get(this.streetField); var cityValue = this.model.get(this.cityField); var stateValue = this.model.get(this.stateField); // 你的$.get请求 $.get('/your-api-url', function(response) { // 在这里修改cityValue cityValue = response.newCity; // 所有需要用最新cityValue的操作都放这里 console.log(cityValue); // 现在输出的就是新值了 // 比如更新Backbone模型、渲染视图等 this.model.set(this.cityField, cityValue); this.render(); }.bind(this)); // 注意绑定this,确保能访问到Backbone的model和方法 }
方法2:用Promise + async/await让代码“看起来同步”
jQuery的AJAX方法(包括$.get)返回的jqXHR对象已经实现了Promise接口,所以可以用async/await来让异步代码更易读:
getFormattedAddress1: async function () { // 注意加async关键字 var postalCodeValue = this.model.get(this.postalCodeField); var streetValue = this.model.get(this.streetField); var cityValue = this.model.get(this.cityField); var stateValue = this.model.get(this.stateField); // 用await等待AJAX请求完成 try { const response = await $.get('/your-api-url'); // 请求完成后再修改cityValue cityValue = response.newCity; // 这时候再打印或者使用,就是新值了 console.log(cityValue); this.model.set(this.cityField, cityValue); } catch (error) { // 处理请求失败的情况 console.error('请求出错:', error); } }
适配Backbone的额外建议
因为你是在Backbone项目里,建议把更新后的值同步到Backbone Model中(就像上面代码里的this.model.set),这样后续视图渲染、数据操作都能自动感知到值的变化,符合Backbone的MVC设计思路。
内容的提问来源于stack exchange,提问作者Gündoğdu Yakıcı
相关产品推荐
相关产品推荐

