请问JS为什么设置变量值不成功,钉钉宜搭


export function getgps() {
  var j = 0;
  var w = 0;
  loadDDApi.then(() => {
    dd.ready(() => {
      // 获取当前地理位置信息(单次定位)
      dd.device.geolocation.get({
        targetAccuracy: 200,
        coordinate: 1,
        withReGeocode: true,
        useCache: true, 
        onSuccess: function (result) {
          var j = result.longitude;//这里经纬度赋值失败
          var w = result.latitude//这里经纬度赋值失败
          alert(result.longitude);//这里能正常弹窗提示经纬度的值
        },
        onFail: function (err) { }
      });
    })
  })
  this.$("textField_kybrsytl").setValue(j);//设置文本框,j的值还是0
  this.$('numberField_kybrsytm').setValue(w);//设置数值框,w的值还是0
}

请问为什么设置选项框内容 j和w 为什么赋值变量失败了呢?

  1. js 运行机制先同步任务 后异步任务
  2. then 属于异步任务的微观任务
  3. 也就说按照你的代码,同步执行var j = 0;this.$("textField_kybrsytl").setValue(j);异步值没有作用复制到文本;
  4. 所以将设置值放到异步任务的成功函数里,进行赋值;
  5. 还要注意this的指向,留住this。

 
export function getgps() {
  var j = 0;
  var w = 0;
  var _this = this;
  loadDDApi.then(() => {
    dd.ready(() => {
      // 获取当前地理位置信息(单次定位)
      dd.device.geolocation.get({
        targetAccuracy: 200,
        coordinate: 1,
        withReGeocode: true,
        useCache: true, 
        onSuccess: function (result) {
          var j = result.longitude;
          var w = result.latitude;
          _this.$("textField_kybrsytl").setValue(j);
          _this.$('numberField_kybrsytm').setValue(w);
        },
        onFail: function (err) { }
      });
    })
  })
 

同步代码遇到异步代码会跳过不执行,你的.then还没执行,你就去给
this.$("textField_kybrsytl").setValue(j);//设置文本框,j的值还是0
this.$('numberField_kybrsytm').setValue(w);//设置数值框,w的值还是0
两个节点赋值 肯定就是你上方的对应数据
异步

img

箭头指向的区域放到 对应中间异步代码下方

export function getgps() {
  var j = 0;
  var w = 0;
  loadDDApi.then(() => {
    dd.ready(() => {
      // 获取当前地理位置信息(单次定位)
      dd.device.geolocation.get({
        targetAccuracy: 200,
        coordinate: 1,
        withReGeocode: true,
        useCache: true, 
        onSuccess: function (result) {
          j = result.longitude;//这里经纬度赋值失败
          w = result.latitude//这里经纬度赋值失败
          this.$("textField_kybrsytl").setValue(j);//设置文本框,j的值还是0
          this.$('numberField_kybrsytm').setValue(w);//设置数值框,w的值还是0
        },
        onFail: function (err) { }
      });
    })
  })


export function getgps() {
  var j = 0;
  var w = 0;
  loadDDApi.then(() => {
    dd.ready(() => {
      // 获取当前地理位置信息(单次定位)
      dd.device.geolocation.get({
        targetAccuracy: 200,
        coordinate: 1,
        withReGeocode: true,
        useCache: true, 
        onSuccess: function (result) {
          var j = result.longitude;//这里经纬度赋值失败
          var w = result.latitude//这里经纬度赋值失败

          this.$("textField_kybrsytl").setValue(j);//设置文本框,j的值还是0
          this.$('numberField_kybrsytm').setValue(w);//设置数值框,w的值还是0
          alert(result.longitude);//这里能正常弹窗提示经纬度的值
        },
        onFail: function (err) { }
      });
    })
  })

js有作用域链,你在最外层定义了j和w是全局变量,在函数内又定义了一个j和w,函数内的不会去改变全局变量的值,你把函数内j和w前面的var去掉就可以了

var外部定义了,里面你又用var定义,相遇于j、w新实例化了对象!前后已经不相同了

export function getgps() {
var j = 0;
var w = 0;
loadDDApi.then(() => {
dd.ready(() => {
// 获取当前地理位置信息(单次定位)
dd.device.geolocation.get({
targetAccuracy: 200,
coordinate: 1,
withReGeocode: true,
useCache: true,
onSuccess: function (result) {

 j = result.longitude;//这里经纬度赋值失败   
          w = result.latitude//这里经纬度赋值失败
      alert(result.longitude);//这里能正常弹窗提示经纬度的值
    },
    onFail: function (err) { }
  });
})

})
this.$("textField_kybrsytl").setValue(j);//设置文本框,j的值还是0
this.$('numberField_kybrsytm').setValue(w);//设置数值框,w的值还是0
}

这样应该没问题了,一开始已经初始化了j,w,你后面onSuccess: function 方法里使用j,w,,不需要加var 了!这样直接报错,因为相当于创建了两个j,w变量,冲突了,这样改之后,onSuccess: function 方法给j,w赋值,后面的赋值文本框就能获取到值了,

如果对你有帮助,请采纳一下