[英]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.