Javascript 手表是异步的吗?

Javascript 手表是异步的吗?,javascript,vue.js,Javascript,Vue.js,我在Vue实例中观察变量radioStatus: watch: { radioStatus: function(val) { if (!this.discovery) { $.ajax({ url: '/switch/api/radio/' + (val ? 'on' : 'off') }) } } 可以在页面重新加载时触发的AJAX调用中对其进行修改: $.ajax({ url: "/api", cache: false })

我在
Vue
实例中观察变量
radioStatus

watch: {
    radioStatus: function(val) {
      if (!this.discovery) {
        $.ajax({ url: '/switch/api/radio/' + (val ? 'on' : 'off') })
      }
    }
可以在页面重新加载时触发的AJAX调用中对其进行修改:

$.ajax({
  url: "/api",
  cache: false
})
  .done(function(response) {
    vm.discovery = true;
    vm.radioStatus = response.radio.ison;  // <-- the change I mention below is here
    vm.discovery = false;
  });
$.ajax({
url:“/api”,
缓存:false
})
.完成(功能(响应){
vm.discovery=true;

vm.radioStatus=response.radio.ison;//是,监视程序是异步的。参考:

引自上述链接:

观察者

虽然计算属性是…但当您想要执行异步或昂贵的操作以响应不断变化的数据时,这是最有用的

在上面的例子中,
vm.discovery=false;
将在进入
watch
之前完成。如果您将
vm.discovery
设置为
false
,那么
radioStatus
内部的ajax调用将始终得到执行

为了避免这种情况,您可以尝试如下操作:
vm.$nextTick()

$.ajax({url: "/api", cache: false})
    .done(function(response) {
        vm.discovery = true;
        vm.radioStatus = response.radio.ison;
        vm.$nextTick( () => {
            console.log("Setting vm.discovery to false");
            vm.discovery = false;
        });
    });
这又是一件棘手的事情,因为您在
watch
中的
radioStatus()
回调也只会发生在
nextTick
中。但假设watch是由前一行本身触发的(
vm.radioStatus=…
),从技术上讲,它应该首先进入队列,因此可以提前完成。您必须使用一系列
console.log
语句进行确认