我尝试编写一个逻辑,当标志变为假时,实现诺言。这是我的代码
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
我的问题在哪里?
答案 0 :(得分:0)
这种“轮询”标志的概念通常是一种有缺陷的方法。相反,您应该了解更改标志的任何内容,并使代码成为事件驱动。这将同时提高响应速度和效率。您可以创建一个EventEmitter
,任何更改该标志的代码都会触发一个事件,并通过侦听一个可以解决自身问题的事件来将诺言与该承诺挂钩。
在您的特定代码中,导致此错误是因为,当您从checkFlag
调用setTimeout()
时,没有向其传递任何参数。因此,再次调用时,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));