对于异步获取器,您可以像这样操作:
const object = {};
Object.defineProperty(object, 'myProperty', {
async get() {
return ;
}
});
相反,当涉及到异步设置器时问题就出现了。
由于表达式
a = b
总是产生
b
,因此在持有属性
a
的对象中没有任何一个设置器可以覆盖这个行为,无法避免这个问题。
既然我也遇到了这个问题,我意识到异步设置器实际上是不可能的。所以,我想出了一种替代设计来代替异步设置器,并提出了以下替代语法:
console.log(await myObject.myProperty); // Get the value of the property asynchronously
await myObject.myProperty(newValue); // Set the value of the property asynchronously
我使用以下代码使其正常工作:
function asyncProperty(descriptor) {
const newDescriptor = Object.assign({}, descriptor);
delete newDescriptor.set;
let promise;
function addListener(key) {
return callback => (promise || (promise = descriptor.get()))[key](callback);
}
newDescriptor.get = () => new Proxy(descriptor.set, {
has(target, key) {
return Reflect.has(target, key) || key === 'then' || key === 'catch';
},
get(target, key) {
if (key === 'then' || key === 'catch')
return addListener(key);
return Reflect.get(target, key);
}
});
return newDescriptor;
}
给定另一个描述符,该描述符允许定义类似于异步设置器的内容,返回异步属性的描述符。
您可以按以下方式使用上述代码:
function time(millis) {
return new Promise(resolve => setTimeout(resolve, millis));
}
const object = Object.create({}, {
myProperty: asyncProperty({
async get() {
await time(1000);
return 'My value';
},
async set(value) {
await time(5000);
console.log('new value is', value);
}
})
});
一旦您像上面那样设置了一个异步属性,就可以按照已经说明的方式进行设置:
(async function() {
console.log('getting...');
console.log('value from getter is', await object.myProperty);
console.log('setting...');
await object.myProperty('My new value');
console.log('done');
})();
customer.getOrders().then(....);
、customer.orders.get(fnThen_or_callBack);
、customer.orders(fnThen_or_callBack);
,或者只是customer.orders().then(....);
更直观(对我来说)。在所有这些情况下,我一眼就能看出除了简单的读取之外还发生了其他事情。 - dandavis