Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测异步递归的结束_Javascript - Fatal编程技术网

Javascript 检测异步递归的结束

Javascript 检测异步递归的结束,javascript,Javascript,我在这里做的是动态生成图片来填充16个画布,有些人说我使用的是异步递归,我甚至没有注意到。我曾尝试使用循环而不是递归,但不知何故,它最终得到了我不知道如何修复的异常。所以我坚持递归。然而,我的问题是如何检测递归的结束,就像注释行显示数组中只有一个项一样 var checkduplicates = new Array(); drawOne(i); //console.log(checkduplicates) function drawOne(i) { //randomly select

我在这里做的是动态生成图片来填充16个画布,有些人说我使用的是异步递归,我甚至没有注意到。我曾尝试使用循环而不是递归,但不知何故,它最终得到了我不知道如何修复的异常。所以我坚持递归。然而,我的问题是如何检测递归的结束,就像注释行显示数组中只有一个项一样

var checkduplicates = new Array();
drawOne(i); 
//console.log(checkduplicates)

function drawOne(i)
{
    //randomly select one photo
    var picinfo = photos[Math.floor(Math.random()*photos.length)];
    //check duplicates pic, if duplicates exist, get another one
    while(checkduplicates.indexOf(picinfo)!=-1||picinfo.title.length>10)
    {
        picinfo = photos[Math.floor(Math.random()*photos.length)];
    }
    checkduplicates.push(picinfo);

    var ctx = document.getElementsByClassName("canvas")[i].getContext('2d');
    var img = new Image(); 
    //get the pic URL
    img.src = "http://farm" + picinfo.farm + ".static.flickr.com/"
    + picinfo.server + "/" + picinfo.id + "_" + picinfo.secret + "_m.jpg";

    img.onload = function()
    {
        // Draw pieces
        ctx.drawImage(img,0,0,132,150);
        ctx.drawImage(frame,0,0,133,152);
        if(picinfo.title=="")
            $("#"+i).append("Untitled");
        else
            $("#"+i).append(picinfo.title);

        i++;
        if (i != canvaslength)
        {
            drawOne(i);
        }
    }

我得到的解释是,据我所知,注释的console.log是在drawOne函数的一系列递归完成之前执行的,但我想要的是,我希望完整的16个图像被完全加载,然后选择它们,这样我就可以对它们做些什么了。因此,问题是如何检测递归的结束。非常感谢。欢迎您忽略我的大部分代码,只看递归部分

这不是“异步递归”。这意味着至少有两个循环同时运行,并且它们异步返回。但事实并非如此

基本上,停止递归的唯一时间是i==canvaslength

那么,就拿那个if语句来说吧

//console.log(checkduplicates)
if (i != canvaslength)
{
    drawOne(i);
}else{
    console.log('recursion is done')  // do what you want here.
}