ES6 的 Class 存值函数(setter)可以是异步吗?

get prop() {
    return this.list
}

set prop(pm = {}) {
    ReqApi.get({
        url: Urls.GET_ENQUIRYLIST,
        pm
    })
        .then(res => {
            this.list = res.list
        })
}

这样好像不行呢!

阅读 3.1k
1 个回答

setter 内部是可以异步的,但是既然是异步的,恐怕就不能在设置值之后马上就能取得出来,如果用 setTimeout 来模拟异步调用,

const target = {
    data: "init",

    get test() {
        return this.data;
    },

    set test(data) {
        setTimeout(() => this.data = data, 1000);
    }
};

console.log("first", target.test);
target.test = "hello";
console.log("second", target.test);
setTimeout(() => console.log("third", target.test), 1000);

输出结果是

first init
second init
third hello

说明 setter 是起作用了的,但是要等待异步调用结速,具体时间并不能确定。如果想确定,可以使用 Callback 或者 Promise,而且不是用 setter,而是用 set 函数,比如(使用 async 语法)

const target = {
    // ....

    async setTest(data) {
        return new Promise(resolve => {
            setTimeout(() => {
                this.data = data;
                resolve();
            }, 1000);
        });
    }
};

(async () => {
    await target.setTest("hi");
    console.log(console.log(target.test));
})();

这里的输出就已经等待到异步过程结束了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题