javascript - watch 是异步的吗?

标签 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
})
  .done(function(response) {
    vm.discovery = true;
    vm.radioStatus = response.radio.ison;  // <-- the change I mention below is here
    vm.discovery = false;
  });

我可以假设由 radioStatus 更改触发的所有方法都将在转到下一行之前完成(即 vm.discovery = false) ?

我担心的是,vm.discovery 是一个标志,被多个监视变量使用(与 radioStatus 的方式相同),它会在监视变量的功能完成。

最佳答案

是的,观察者是异步的。引用:https://vuejs.org/guide/computed.html#Watchers

引用自上面的链接:

Watchers

While computed properties are... This is most useful when you want to perform asynchronous or expensive operations in response to changing data.

在您上面的例子中,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 语句进行确认。

关于javascript - watch 是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40321994/

相关文章:

javascript - Youtube API 未捕获( promise )错误 : Request failed with status code 403

javascript - 在 vue.js 中显示原始图像内容类型

html - VueJS : dropdown items background color

javascript - HTML5 Canvas 游戏生成间隔

javascript - 删除对象属性 (VueJs)

javascript - 在 NextJS 应用程序上使用 npm run dev 时出现意外 token

javascript - 两个数字相加就变成了连接两个数字,但结果是一个数字值? JavaScript

javascript - 如何在 <template> 之前加载 Vuejs 单文件组件的 &lt;script&gt; 部分

javascript - 尝试使用 map 方法而不是使用 React Typescript 的 for 循环

javascript - 如何测试返回匿名函数的node.js模块?