繁体   English   中英

解决 promise 直到标志为假

[英]resolve a promise until flag is false

我尝试编写一个逻辑,即在标志变为假时满足 promise。 这是我的代码

let flag = true;

setTimeout(() => (flag = false), 5000); //set flag to false after 5s

const checkFlagPromise = () => {
  return new Promise((resolve) => {
    checkFlag(resolve);
  });
};

const checkFlag = (resolve) => {
  console.log("check flag");
  flag ? setTimeout(checkFlag, 500) : resolve("done");
};

checkFlagPromise().then((msg) => console.log(msg)).catch((err) => console.log(err));

但是,我收到了这个错误

test.js:34
  flag ? setTimeout(checkFlag, 500) : resolve("done");
                                      ^
TypeError: resolve is not a function

我的问题出在哪里?

这种“轮询”标志的概念通常是一种有缺陷的方法。 相反,您应该挂钩任何更改标志并使您的代码事件驱动的内容。 这将更加灵敏和高效。 您可以创建一个EventEmitter ,任何更改标志的代码都会触发一个事件,并通过侦听一个可以自行解决的事件将您的 promise 挂接到该事件中。

在您的特定代码中,错误是因为当您从setTimeout()调用checkFlag时,您没有将任何 arguments 传递给它。 因此,当它再次被调用时, resolve参数将是undefined 您可以通过将resolve参数添加到您的setTimeout()调用来解决这个问题,如下所示:

const checkFlag = (resolve) => {
  console.log("check flag");
  flag ? setTimeout(checkFlag, 500, resolve) : resolve("done");
};

您可以在此处看到修复工作,但更好的方法是挂钩更改标志的真实代码并使用事件而不是轮询:

 let flag = true; setTimeout(() => (flag = false), 5000); //set flag to false after 5s const checkFlagPromise = () => { return new Promise((resolve) => { checkFlag(resolve); }); }; const checkFlag = (resolve) => { console.log("check flag"); flag? setTimeout(checkFlag, 500, resolve): resolve("done"); }; checkFlagPromise().then((msg) => console.log(msg)).catch((err) => console.log(err));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM