观察对象的值变化

时间:2021-06-19 02:32:31

标签: javascript

我如何观察一个对象并等待它的所有值都为真。

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
}

2 个答案:

答案 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 函数中使用带有 Promiseawaitasync

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)

相关问题