Javascript 创建在变量未定义时解析的承诺

Javascript 创建在变量未定义时解析的承诺,javascript,promise,async-await,settimeout,Javascript,Promise,Async Await,Settimeout,我试图创建一个承诺,当变量不是未定义时解决该问题 代码示例 let dataFetched var promiseResolve, promiseReject; let x = { aListener: function (val) { if (dataFetched) promiseResolve(dataFetched); }, set a(val) { dataFetched = val; this.aListener(val); }, get a

我试图创建一个承诺,当变量不是未定义时解决该问题

代码示例

let dataFetched
var promiseResolve, promiseReject;

let x = {
  aListener: function (val) {
    if (dataFetched) promiseResolve(dataFetched);
},
  set a(val) {
    dataFetched = val;
    this.aListener(val);
  },
  get a() {
    return dataFetched;
  },
  registerListener: function (listener) {
    this.aListener = listener;
  }
};

let fetchedPromise = new Promise((resolve, reject) => {
 promiseResolve = resolve;
  promiseReject = reject;
});

这是可行的,但我发现它效率低下,因为它容易调用堆栈,而且似乎是错误的

我尝试过的其他非工作解决方案:

//-------------SOLUTION 1
let fetchedPromise = new Promise((resolve, reject) => {
  const check = ()=>{
    if (dataFetched) resolve(dataFetched);
    else check()
  }
  check()
});

//--------------------SOLUTION 2
let fetchedPromise = new Promise((resolve, reject) => {
   if (dataFetched) resolve(dataFetched);
});
场景


我需要一个类似解决方案3的函数,它不依赖于使用Javascript代理解决的setTimeout

基本上,我将代理对象分配给侦听更改的dataFetched。 我重新创建了监听功能,因为它必须包括
resolve()

编辑

实际上,可以将promise的
resolve()
函数外部化,但也有一些缺点

示例

let dataFetched
var promiseResolve, promiseReject;

let x = {
  aListener: function (val) {
    if (dataFetched) promiseResolve(dataFetched);
},
  set a(val) {
    dataFetched = val;
    this.aListener(val);
  },
  get a() {
    return dataFetched;
  },
  registerListener: function (listener) {
    this.aListener = listener;
  }
};

let fetchedPromise = new Promise((resolve, reject) => {
 promiseResolve = resolve;
  promiseReject = reject;
});


很可能是您想要的。
assignData
无法接受回调或返回承诺本身@Sirko我如何在代码中集成mutationObserverconst callback=function(observer){if(observer)console.log(“observer is”,observer)}const observer=newmutationobserver(callback)observer.observer(dataFetched);`这将返回观测者上的节点错误
assignData
只是一个假函数,表示变量已更改。在我的“real”代码中,有一个函数为
assignData
赋值,很明显,这是一个示例。我想确保您没有完全弄错树,没有错过像
assignData()这样的简单选项。然后(…)
let dataFetched
var promiseResolve, promiseReject;

let x = {
  aListener: function (val) {
    if (dataFetched) promiseResolve(dataFetched);
},
  set a(val) {
    dataFetched = val;
    this.aListener(val);
  },
  get a() {
    return dataFetched;
  },
  registerListener: function (listener) {
    this.aListener = listener;
  }
};

let fetchedPromise = new Promise((resolve, reject) => {
 promiseResolve = resolve;
  promiseReject = reject;
});