首页 > 技术文章 > Salesforce: wire的恼人之处

badnumber 2021-10-28 03:37 原文

刚做的一个lwc,里面需要Account的数据,很自然想到用getRecord来做,这样就不需要apex:

  @wire(getRecord, { recordId: '$accountId', fields: ACC_FIELDS })
  getAccountData(result) {
    this.wiredAccountData = result;
if (result.data) {
      this.badDebtStatus = getFieldValue(result.data, Bad_Debt_Status);
      ......
    }
  }

需要刷新时,就用refreshApex(this.wiredAccountData); 来获得最新的Account数据。以为这就是“标准”的做法。

调试时却发现,首先,refreshApex是“异步”的。它不过是触发了wire方法,就算完成了任务,但是它不会等getAccountData完全执行完毕,再执行refreshApex的下一条语句。即使用refreshApex(this.wiredAccountData).then()也不行。没办法,只好加一个变量,先设成false,在getAccountData方法的末尾改成true,然后在refreshApex后,先检测这个变量是否为true,如不是,则用setTimeout延时重试。

而这样也没解决问题。调试发现,某些情况下,这个变量始终是false,不会变成true,也就是说getAccountData方法根本没有执行。

折腾了半天之后,只好放弃wire方法,改用apex来取Account数据,用lwc来调用。

感觉wire方法如果可以改变输入参数,它会自动更新数据,还比较方便。如果需要手工通过refreshApex来刷新,不是太可靠。

推荐阅读