yurygolikov
@yurygolikov

Как в ES6 работать с асинхронными операциями в обработчике Proxy?

Как заставить подождать выполнения обработчика Proxy после отслеживаемого действия (например, подождать обработчик Proxy операции присовения, а уже потом продолжить исполнение)?

Скорее всего, я что-то не допонимаю или упустил. Спасибо за ответы.

Упрощенный пример:
function PromiseTimeOut() {
    return new Promise((resolve, reject) => {
        setTimeout(resolve ,1000);
    });
}

const target = {
    value: null,
    setValue(value) {
        this.value = value;
        console.log(this.value); //Тут будет NULL
    }
};
const proxy = new Proxy(target, {
  get(target, prop) {
    return target[prop];
  },
  async set(target, prop, value) {
    await PromiseTimeOut();
    target[prop] = value;
    return true;
  }
});

proxy.setValue(1);
//В этом месте исполнение должно подождать асинхронного обработчика Proxy.set
console.log(proxy.value);//И тут будет NULL


Пробовал также делать set обработчик синхронной, а в target[prop] присваивать Promise. Все равно само присваивание в обработчике происходит позже.

function PromiseTimeOut() {
    return new Promise((resolve, reject) => {
        setTimeout(resolve ,1000);
    });
}

const target = {
    value: null,
    async setValue(value) {
        this.value = value;
        await this.value; // СЮДА НЕ ПРИХОДИТ ПРОКСИ, а по идее должен
        console.log(this.value); //Тут будет NULL
    }
};
const proxy = new Proxy(target, {
    get(target, prop) {
        return target[prop];
    },
    set(target, prop, value) {
        target[prop] = new Promise(async (resolve, reject) => {
            await PromiseTimeOut();
            resolve();
        });
        return true;
    }
});

proxy.setValue(1);


Делаю на node.js последней версии. Использую новый синтаксис async/await
  • Вопрос задан
  • 584 просмотра
Пригласить эксперта
Ответы на вопрос 2
Мне кажется такое не получится. По сути вам нужно написать что-то типа:
setValue(value) {
        await this.value = value;
        console.log(this.value); //Тут будет NULL
    }

Но такого синтаксиса нет (и вроде не планируется).

А почему на сам setValue не повесить Proxy?
const proxy = new Proxy(target, {
 async setValue(target, prop) {
    await PromiseTimeOut();
    target[prop] = value;
    return true;
  },
});

Тогда можно будет писать
await proxy.setValue(1)
Ответ написан
lazalu68
@lazalu68
Salmon
Я говорил о чем-то типа отдельной процедуры в которую можно запихнуть все нужные вам действия и там уже останавливать что угодно и как угодно.
Как-то так
function PromiseTimeOut(delay) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, delay);
    });
}

var target = {
    value: null,
    setValue(value) {
        this.value = value;
    }
};

var proxy = new Proxy(target, {
  get(target, prop) {
    return target[prop];
  },
  set(target, prop, value) {
    target[prop] = value;
    return true;
  }
});

async function demo() {
	proxy.setValue('I have no idea what i\'m doing');
	await PromiseTimeOut( 1000 );
	console.log( proxy.value );
}

demo(); 
// Promise, а через секунду
// "I have no idea what i'm doing"

Как вам и предлагали, можно proxy.setValue тоже сделать асинхронной функцией.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы