等待画布动画和提取完成

问题描述 投票:0回答:1

因此,我在为画布设置动画(以创建某种过渡)的同时获取数据(使用$ .ajax),并且我正在等待数据被获取以及动画完成之后再执行其他操作。

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

所以我在考虑一个诺言,但出现错误“未捕获的TypeError:resolve不是一个函数”,这可能是由于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


});
javascript ajax canvas requestanimationframe
1个回答
1
投票

代码的问题是,当drawing回调函数调用requestAnimationFrame函数时,不会传递参数resolvereject。这就是为什么出现错误Uncaught TypeError: resolve is not a function的原因(因为它是undefined)。

要修复它,我们需要有另一个专用于处理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...

}

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.