鍍金池/ 問答/HTML/ ES6 的 Class 存值函數(shù)(setter)可以是異步嗎?

ES6 的 Class 存值函數(shù)(setter)可以是異步嗎?

get prop() {
    return this.list
}

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

這樣好像不行呢!

回答
編輯回答
毀與悔

setter 內(nèi)部是可以異步的,但是既然是異步的,恐怕就不能在設(shè)置值之后馬上就能取得出來,如果用 setTimeout 來模擬異步調(diào)用,

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);

輸出結(jié)果是

first init
second init
third hello

說明 setter 是起作用了的,但是要等待異步調(diào)用結(jié)速,具體時間并不能確定。如果想確定,可以使用 Callback 或者 Promise,而且不是用 setter,而是用 set 函數(shù),比如(使用 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));
})();

這里的輸出就已經(jīng)等待到異步過程結(jié)束了

2017年8月2日 03:40