我如何观察一个对象并等待它的所有值都为真。
const myObject = {
key1: null,
key2: null,
key3: null,
}
// do async ops that mutate myObject
const someFunction = async () => {
await Object.values(myObject).every(v => !!v)
// continue
}
答案 0 :(得分:3)
您可以使用 Proxy
。
const myObject = new Proxy({
key1: null,
key2: null,
key3: null,
}, {
set(obj, prop, val){
obj[prop] = val;
if(val && Object.values(obj).every(x => x)) console.log('All truthy:', obj);
return val;
}
});
myObject.key1 = true;
setTimeout(()=>{
myObject.key2 = true;
myObject.key3 = true;
}, 1000);
您可以在 setTimeout
函数中使用带有 Promise
的 await
来async
。
const myObject = {
key1: null,
key2: null,
key3: null,
}
function allTruthy(object) {
return new Promise(function f(resolve, reject) {
if (Object.values(object).every(v => v)) resolve();
else setTimeout(f.bind(null, resolve, reject), 500);
});
}
const someFunction = async() => {
await allTruthy(myObject);
console.log(myObject);
}
someFunction();
myObject.key1 = true;
setTimeout(() => {
myObject.key2 = true;
myObject.key3 = true;
}, 1000);
答案 1 :(得分:1)
对象中的 Getter、setter 和解析函数可以做到这一点
let obj = {
get key1() { return this._key1 },
get key2() { return this._key2 },
get key3() { return this._key3 },
set key1(v){ this._key1 = v; isAllTruthy() },
set key2(v){ this._key2 = v; isAllTruthy() },
set key3(v){ this._key3 = v; isAllTruthy() }
};
const isAllTruthy = () => {
if (obj.key1 && obj.key2 && obj.key3) console.log('doWhenTruthy')
}
obj.key1 = "john"
obj.key2 = "bill"
console.log(obj.key1)
setTimeout(() => obj.key3 = "sally", 1000)