Vue.js - 在更新异步计算 属性 后更新计算 属性

Vue.js - Update computed property after async computed property gets updated

我有一个计算 属性 (filteredSyms),它依赖于异步计算 属性 (allSynonyms)。我为此使用异步计算插件: https://www.npmjs.com/package/vue-async-computed

但是,当数据更新时,计算 属性 不会等到异步 属性 更新的结果。因此,我收到的信息不是最新的。然后在异步 属性 实际上 return 计算出的新值 属性 不会再次 运行 更新。

我怎样才能让它按照计算机 属性 等待异步计算 属性 的结果的方式工作?

代码如下:

asyncComputed: {
  async allSynonyms() {
    let allSyns = await this.$axios.$post('/db/sym/synonyms', this.model.syms);
    return allSyns;
  }
},

computed: {
  filteredSyms() {

    let that = this;
    let allSyn = this.allSynonyms;

    let exactMatch = this.symsByRating.filter(
      function (v) {
        let isExactMatch = v.title.toLocaleLowerCase().indexOf(that.searchString.toLocaleLowerCase()) >= 0;

        return !that.idsToFilter.includes(v.id) && isExactMatch
          && (!that.currentBodyPart || v.bodyParts.indexOf(that.currentBodyPart) >= 0)
          && that.hasMoreSubsyms(v)
          && (!allSyn || !that.containsObject(v, allSyn))
          && (v.sex == that.model.sex || v.sex == 'NA');
      });

    let partialList = [];

    exactMatch.forEach(ex => partialList.push({n: 100, sym: ex}));

    for (let sym of this.symsByRating ) {

      let searchWords = this.searchString.toLocaleLowerCase().split(' ');
      let symWords = sym.title.toLocaleLowerCase().split(' ');

      let n = 0;
      let isPartialMatch = false;
      symLoop:for (let symWord of symWords) {
        symWord = symWord.substring(0, symWord.length - 1);
        for (let searchWord of searchWords) {

          // don't count last letters of the words
          searchWord = searchWord.substring(0, searchWord.length - 1);

          if (searchWord.length > 2 && symWord.indexOf(searchWord) >= 0) {
            n++;
            isPartialMatch = true;
          }
        }
      }

      if (exactMatch.indexOf(sym) < 0 && isPartialMatch
        && (!this.currentBodyPart || sym.bodyParts.indexOf(this.currentBodyPart) >= 0)
        && this.hasMoreSubsyms(sym)
        && (!allSyn || !this.containsObject(sym, allSyn))
        && (sym.sex == that.model.sex || sym.sex == 'NA')) {

        partialList.push({n: n, sym: sym});

      }
    }

    partialList.sort(function(obj1, obj2) {
      return obj2.n - obj1.n;
    });

    if (this.searchString && this.searchString != '') {
      partialList = this.filterSynonyms(partialList);
    }

    let fs = partialList.map(ws => ws.sym);

    console.dir(fs);

    return fs;

  }
}

很多东西都在 filtered 方法上,但我想这里的重点是它使用 this.allSynonyms 进行检查,但在执行 filteredSyms 时它不会更新。

感谢您的建议!

(我还没有真正测试过这个,但它应该可以工作。)

vue-async-computed 确实提供 this.$asyncComputed.allSynonyms.success 中的状态。

尝试将 this.$asyncComputed.allSynonyms.success 添加为 filteredSyms 的依赖项,它应该在成功状态更改时更新。