解决承诺直到标志为假

时间:2020-07-29 16:37:45

标签: javascript 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

我的问题在哪里?

1 个答案:

答案 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));