创建一个在变量未定义时解析的 Promise

Create a Promise that resolves when variable is not undefined

我正在尝试创建一个在变量未 未定义.

时解析的 Promise

代码示例

https://codesandbox.io/s/quizzical-feynman-ktvox?file=/src/index.js

let fetchedPromise = new Promise((resolve, reject) => {
  const check = ()=>{
    setTimeout(() =>{
    console.log("checking")
    if (dataFetched) resolve(dataFetched);
    else check()
    }, 100);
  }
  check()
});

const waitForDataFromAnotherComponent = async () => {
  let result = await fetchedPromise;
  console.log("Result: ", result);
};

const assignData = () => {
  setTimeout(() => {
    dataFetched = 1000;
    console.log(dataFetched);
  }, 5000)
};

waitForDataFromAnotherComponent();
assignData();

这行得通,但我发现它效率低下,因为它容易调用堆栈,而且看起来不对。

我尝试过的其他无效解决方案:

//-------------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);
});

场景

我需要一个不依赖于 setTimeout 的解决方案 3 的功能

使用Javascript代理解决

基本上,我将一个代理对象分配给 dataFetched 以侦听更改。 我re-create监听的功能,因为它必须包含resolve()

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

let fetchedPromise = new Promise((resolve, reject) => {
  x.registerListener(function (val) {
    console.log("yeyyyyyyyyyyyyyyy");
    if (dataFetched) resolve(dataFetched);
  });
});

const waitForDataFromAnotherComponent = async () => {
  let result = await fetchedPromise;
  console.log("Result: ", result);
};
const assignData = async () => {
  await new Promise((resolve, reject) =>
    setTimeout(() => {
      x.a = 1000;
      console.log(dataFetched);
      resolve(dataFetched);
    }, 1000)
  );
};

waitForDataFromAnotherComponent();
assignData();

编辑

实际上,可以将 promise 的 resolve() 功能外部化,但有一些缺点 here

例子

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;
});