首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我点击一个按钮,它会解决一个承诺,如果我再次点击它,它会等待到先前的承诺被解决。

当我点击一个按钮,它会解决一个承诺,如果我再次点击它,它会等待到先前的承诺被解决。
EN

Stack Overflow用户
提问于 2022-04-01 11:51:57
回答 1查看 571关注 0票数 0

代码语言:javascript
运行
复制
  let msg = "Done";
  function promise() {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve("Done");
      }, 2000);
    });
  }
  async function func1() {
    msg = "Pending";
    console.log("Starting...");
    const a = await promise();
    console.log(a);
    msg = a;
  }

  async function func2() {
    console.log("Queued");
  }

  async function call() {
    if ((msg) === "Done") {
      func1();
    } else {
      func2();
    }
  }
代码语言:javascript
运行
复制
<h1>PROMISE</h1>
<input onclick="call()" type="button" value="Click me " />

我将这段代码添加到func2()中,它在解决之前的承诺后运行func1(),但在单击之后也会立即运行。我怎么能这样做,它只运行后,先前的承诺是解决。

代码语言:javascript
运行
复制
func2() {
  console.log("Queued");
  await func1();
  func1();
}

编辑:伙计们!我使用Date().getTime()方法解决了这个问题,并添加了"clicks“变量。结果几乎是一样的。但是这样做的方式是不同的。当我点击它立即开始执行承诺,但我希望它等待,直到上次点击的承诺完成,然后才开始执行一个新的承诺。我想肯定还有其他更简单的解决办法。

代码语言:javascript
运行
复制
 let msg = "Done";
  let clicks = 0;
  let t1;
  let t2;
  let timeout = 0;
  let txt = "";
  function promise() {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve("Done");
      }, 2000 * clicks - timeout);
    });
  }
  async function func1() {
    clicks = 1;
    timeout = 0;
    txt = "";
    msg = "Pending";

    let time = new Date();
    t1 = time.getTime();
    const a = await promise();
    let taym = new Date();
    let now = taym.getTime();
    createDiv(now, t1, txt);
    msg = a;
  }

  async function func2() {
    clicks++;
    let time = new Date();
    t2 = time.getTime();
    timeout = t2 - t1;
    const a = await promise();
    let taym = new Date();
    let now = taym.getTime();
    txt = " and " + (now - t2) + " ms after last click";
    createDiv(now, t1, txt);
  }

  async function call() {
    if (msg === "Done") {
      func1();
    } else {
      func2();
    }
  }

  function createDiv(a, b, c) {
    let div = document.createElement("div");
    div.innerHTML = "Created " + (a - b) + " ms after main click" + c;
    document.body.appendChild(div);
  }
代码语言:javascript
运行
复制
<h1>PROMISE</h1>
<input onclick="call()" type="button" value="Click me " />

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-01 12:11:17

下面的代码可以实现我认为你想要的

解析该事件,只是为了显示第二次单击中显示的timeStamp是第一个单击timeStamp,因为在本例中,这就是承诺的解决方案。

但不确定这段代码有多有用

代码语言:javascript
运行
复制
const promise = new Promise(resolve => {
  document.getElementById('bang').addEventListener('click', e => {
    console.log('first click');
    resolve(e);
  }, { once: true });
})
promise.then(e => {
  console.log(e.timeStamp, e.type, e.target.id);
  document.getElementById('bang').addEventListener('click', e => {
    promise.then(e => {
      console.log('not the first click');
      console.log(e.timeStamp, e.type, e.target.id);
    })
  })
})
代码语言:javascript
运行
复制
<button id="bang">Resolve the promise</button>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71706480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档