代码之家  ›  专栏  ›  技术社区  ›  Embid123

setTimeout在eventlistener中不起作用

  •  1
  • Embid123  · 技术社区  · 7 年前

    button.addEventListener("click", function(){
    
      for(let i = bob_x; i < 1504; i++){
        setTimeout(function(){
          pos_x = i;
          //console.log("vx: " + vx);
          //console.log("vy: " + vy);
          //console.log("i: " + i);
          //console.log("G: " + G);
          pos_y = vy/vx*i - G*i*i/2/vx/vx;
    
          obj.style.setProperty("left", pos_x);
          obj.style.setProperty("top", parseInt(pos_y, 10));
        }, 100)
      }
    })
    

    它不需要等待,并且在大约一刻钟内执行所有操作。我不知道为什么。

    这里的vx和vy是向量的坐标,由事件“mousedown”的坐标减去事件“mouseup”的坐标得到。Bob_x是代表一个人的块的x坐标。

    2 回复  |  直到 7 年前
        1
  •  3
  •   T.J. Crowder    7 年前

    它不需要等待,并且在大约一刻钟内执行所有操作。

    十分之一,实际上(100毫秒)。

    主要的问题是你要安排一堆计时器 全部的 100 通过 i - bob_x + 1 :

    button.addEventListener("click", function(){
    
      for(let i = bob_x; i < 1504; i++){
        setTimeout(function(){
          // ...
        }, 100 * (i - bob_x + 1)) // <============
      }
    })
    

    另外,奇怪的是 pos_x pos_y

    如果这是出于动画目的,您可能需要使用 requestAnimationFrame 为了这个。 Here's an article by Paul Irish 这也许有用。

        2
  •  2
  •   CertainPerformance    7 年前

    你的 for 对于 await A. delay

    const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
    button.addEventListener("click", async function(){
    
      for(let i = bob_x; i < 1504; i++){
        await delay(100);
        pos_x = i;
        //console.log("vx: " + vx);
        //console.log("vy: " + vy);
        //console.log("i: " + i);
        //console.log("G: " + G);
        pos_y = vy/vx*i - G*i*i/2/vx/vx;
    
        obj.style.setProperty("left", pos_x);
        obj.style.setProperty("top", parseInt(pos_y, 10));
      }
    })