javascript - 等待 Canvas 动画并获取完成

标签 javascript ajax canvas requestanimationframe

因此,我在对 Canvas 进行动画处理(以创建某种过渡)时获取数据(使用 $.ajax),并且我希望等待获取数据和完成动画以执行其他操作.

我可以轻松等待获取完成,但启动 Canvas 动画的第二个函数正在调用另一个函数,该函数检查动画是否完成。

所以我正在考虑一个 promise ,但我收到一个错误“Uncaught TypeError:resolve is not a function”,这可能是由于 requestAnimationFrame 造成的。

我已经尝试了很多事情(等待等),但似乎无法理解它。

知道为什么或如何以更简单的方式实现这一目标吗? 预先非常感谢!

function draw() {

    return new Promise( function drawing(resolve, reject) {

        ctx.clearRect(0, 0, canvas.width, canvas.height); 
        ctx.fillStyle = "rgba(255, 255, 255," + opacity + ")";
        ctx.fillRect(0, 0, canvasWidth, canvasHeight) ;

        for (var i = particles.length - 1; i >= 0; i--) {

            particles[i].drawParticle(img); 

            if (particles[i].outOfCanvas) { 
                particles.splice(i, 1);
            }

        }

        fogAnimation = requestAnimationFrame(drawing);

        if(particles.length === 0) {
            cancelAnimationFrame(fogAnimation);
            // below is the error 
            resolve();
        }

    });

};

function launchTransition() {

    img.onload = function()  {     
        draw().then(function() {
            //here is my issue
            console.log("done !");
        })
    };

    img.src = particle_image;

    // doing more stuff...

}



$('.button').on("click", function() {

    fetchData();

    launchTransition();

    //here I want to wait for the two functions above to be done and do something else


});

最佳答案

您的代码的问题是,当 drawing 函数被 requestAnimationFrame 回调调用时,参数 resolvereject未通过。这就是为什么您会收到错误Uncaught TypeError:resolve is not a function(因为它是未定义)。

为了解决这个问题,我们需要另一个专门用于处理 Promise 的变量(我将其称为 drawingTracker)。我还有一个片段供您了解。

var drawingTracker  = {
    resolve: undefined, // this will point to promise resolve
    draw() {
        return new Promise(resolve, reject) {
            this.resolve = resolve // this.resolve (or drawTracker.resolve) is pointing to promise resolve
            draw(); // call draw function below
        }
    },
    finish() {
        this.resolve(); // will resolve promise
    }
};

function draw() { // this function will be called many times by requestAnimationFrame callback
  ctx.clearRect(0, 0, canvas.width, canvas.height); 
  ctx.fillStyle = "rgba(255, 255, 255," + opacity + ")";
  ctx.fillRect(0, 0, canvasWidth, canvasHeight) ;

  for (var i = particles.length - 1; i >= 0; i--) {

    particles[i].drawParticle(img); 

    if (particles[i].outOfCanvas) { 
      particles.splice(i, 1);
    }

  }

  fogAnimation = requestAnimationFrame(draw);

  if(particles.length === 0) {
    cancelAnimationFrame(fogAnimation);
    drawingTracker.finish(); // this line will resolve promise without errors
  }
};


function launchTransition() {

    img.onload = function()  {     
        drawingTracker.draw().then(function() { // this line do the trick!!
            console.log("done !");
        })
    };

    img.src = particle_image;

    // doing more stuff...

}

希望有帮助。

关于javascript - 等待 Canvas 动画并获取完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59334826/

相关文章:

javascript - 如何让我的角色随着重力跳跃?

javascript - WebRTC 的无服务器实现

javascript - 为什么Ajax请求改变参数值?

javascript - Canvas 中的链接 (HTML5)

javascript - 使用纯 JavaScript 计算数组中的负数、正数和零元素

javascript - Node js 中的动态异步等待

php - jQuery Ajax 请求仅适用于单个表单提交

javascript - Google是如何实现首页的淡入淡出效果的?

javascript - 从类似 Blob 的图像的(内部和外部)边缘创建路径

javascript - aframe:如何从 Canvas 中获取像素