首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要帮助将重复的任务转换为递归函数Javascript

我需要帮助将重复的任务转换为递归函数Javascript
EN

Stack Overflow用户
提问于 2019-07-09 17:44:46
回答 1查看 44关注 0票数 0

我有一个名为animateLinesDrawing_v1的函数,用于绘制线条的动画。该函数采用两个参数,一个行数组和一个圆数组,并使用画布fabricJS绘制绘图,但是有一个部分一直重复使用特定的模式,我想将其转换为一个名为drawNextLine的递归函数。

代码语言:javascript
复制
function animateLinesDrawing_v1(lines, circles)
{
  //Let's say we have 4 lines that connect 3 circles
  lines[0].animate({
        x2: circles[1].left,
        y2: circles[1].top
    }, 
    {
        duration: 4000, //line_1 duration
        onChange: canvas.requestRenderAll.bind(canvas),
        onComplete: function()
        {
            lines[0].setCoords();
            lines[1].animate({
                x2: circles[2].left,
                y2: circles[2].top
            }, 
            {
                duration: 4000, //line_2 duration
                onChange: canvas.requestRenderAll.bind(canvas),
                onComplete: function()
                {
                    lines[1].setCoords();
                    lines[2].animate({
                        x2: circles[3].left,
                        y2: circles[3].top

                    }, 
                    {
                        duration: 4000, //line_3 duration
                        onChange: canvas.requestRenderAll.bind(canvas),
                        onComplete: function()
                        {
                            lines[2].setCoords();
                            lines[3].animate({
                                x2: circles[4].left,
                                y2: circles[4].top
                            },
                            {
                                duration: 4000, //line-4(last line) duration, 
                                onChange: canvas.requestRenderAll.bind(canvas),
                                onComplete: lines[3].setCoords.bind(lines[3])
                            });   
                            
                        }
                        

                    });
                }
                
            });
        }

    });

}

function animateLinesDrawing_v2(lines, circles)
{
  //Let's say we have 4 lines that connect 3 circles
  lines[0].animate({
        x2: circles[1].left,
        y2: circles[1].top
    }, 
    {
        duration: 4000, //line_1
        onChange: canvas.requestRenderAll.bind(canvas),
        onComplete: drawNextLine(lines, circles)
    });
}

let n = lines.length;
let m = 0;
function drawNextLine(lines, circles)
{
    
    if(m !== n)
    {
        lines[m].setCoords();
        lines[m + 1].animate({
            x2: circles[m + 2].left,
            y2: circles[m + 2].top
        },
        {
            duration: 400,
            onChange: canvas.requestRenderAll.bind(canvas),
            onComplete: drawNextLine(lines, circles)
        });
        m++;
    }
    else
    {
        lines[m - 1].setCoords.bind(lines[m - 1]);
    }
    
    
}

我的问题是递归函数没有停止运行,所以我可以将它用于函数animateLinesDrawing_v2。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-09 18:00:50

我会把这个任务画成一个承诺:

代码语言:javascript
复制
 function drawLine(line, circle) {
   return new Promise(resolve => {
     line.animate({
       x2: circle.left,
       y2: circle.top
    },  {
      duration: 4000, //line_1 duration
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: function() {
        line.setCoords();
        resolve();
      },
    });
  });
 }

然后,您可以轻松地将其写成一个循环:

代码语言:javascript
复制
  (async function() {
    for(let i = 0; i < lines.length && i < circles.length; i++) {
       await drawLine(lines[i], circles[i]);
    }
 })();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56958053

复制
相关文章

相似问题

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