Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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
Android ImgCache-如何在嵌套for循环内正确等待异步完成_Android_Angularjs_Cordova - Fatal编程技术网

Android ImgCache-如何在嵌套for循环内正确等待异步完成

Android ImgCache-如何在嵌套for循环内正确等待异步完成,android,angularjs,cordova,Android,Angularjs,Cordova,我正在为Android开发Cordova应用程序。我必须解析由帖子组成的JSON。每篇文章都有文本(标题、描述、类别等)和图像(图像数组-可以是一个或多个)。我的目标是存储JSON数据以供脱机使用(保存到SQLlite数据库)。现在,下面的示例代码起作用,但顺序不是我所期望的: 请求JSON(ok) 等待所有承诺(ok) 解析JSON(在下载所有图像之前完成) 将信息存储到数据库中,但图像仍在下载(在后台线程中-对UI无害) 我想要的是在下载完所有图像后将其存储到数据库中。我已经尝试过很多方法,

我正在为Android开发Cordova应用程序。我必须解析由帖子组成的JSON。每篇文章都有文本(标题、描述、类别等)和图像(图像数组-可以是一个或多个)。我的目标是存储JSON数据以供脱机使用(保存到SQLlite数据库)。现在,下面的示例代码起作用,但顺序不是我所期望的:

  • 请求JSON(ok)
  • 等待所有承诺(ok)
  • 解析JSON(在下载所有图像之前完成)
  • 将信息存储到数据库中,但图像仍在下载(在后台线程中-对UI无害)
  • 我想要的是在下载完所有图像后将其存储到数据库中。我已经尝试过很多方法,比如用递归函数替换第二个for循环(如前所述处理异步函数)和许多其他类似的方法,但我相信问题是从第一个for循环开始的,它不会等待
    checkCache
    完成。你怎么认为?我如何克服这个问题?如果你需要任何进一步的解释,就问我

    我的设置是:
    Cordova 4.0.0
    Angular 1.3.1
    ImgCache 1.0

    我的做法是:

    第一。请求JSON:

    promise1 = $http({method: 'GET', url: baseURL + options1};
    promise2 = $http({method: 'GET', url: baseURL + options2};
    //...
    
    第二。等待所有的承诺

    return $q.all([promise1,promise2,...]).then(function(data){
       var promise1size = data[0].data.posts_number;//posts.length;
       parseJSON(data[0],promise1size,'category1');
       var promise2size = data[1].data.posts_number;//posts.length;
       parseJSON(data[1],promise1size,'category2');
    
      //similar for the rest promises
    });
    
    三,。解析JSON

    function parseJSON(respdata,size,category){            
            console.log("Parsing "+size+" "+category);
            for(i=0;i<size;i++){
                var item = {};
                item ["id"] = respdata.data.object[i].id;
                item ["title"] = respdata.data.object[i].title;
                item ["description"] = respdata.data.object[i].description;
    
                var jsarray = respdata.data.object[i].categories;
                item ["category"] = jsarray[0].title;
                item ["catid"] = jsarray[0].id; 
    
                //Other JSON keys here similar as above
    
                //Here it starts...                
                var jsattachement = respdata.data.object[i].attachments;
                var atsize = jsattachement.length;
                if(atsize>0){   
                    var images=[];
                    for(j=0;j<atsize;j++){
                        (function(j){checkCache(jsattachement[j].url)}(j));//here is the problem
                        multimedia.push({title:item["title"], src:ImgCache.returnCachedURL(jsattachement[j].url), w:400,h:300});               
                        images.push({title:item["title"],src:ImgCache.returnCachedURL(jsattachement[j].url),w:400,h:300});
                    }
                    item ["attachement"] = images;
                }else
                    item ["attachement"] = [];
    
                if(category=='category1')
                    response.category1.push(item);
                else if(category=='category2')
                    response.category2.push(item);
                //else if...
                //else if...
            }
        }
    };
    
    第四。存储到数据库

    在这里,我将解析后的信息保存到数据库中。在步骤3中,我对图像使用了
    returnCachedURL
    功能(这不是异步的),这样即使图像可能尚未下载(但最终会下载),也可以准备好图像的本地路径。

    我这样做:

    与您类似,但使用更新sql存储每个下载图像的图像。然后,我发现我的一些用户想和我一起玩,他们在图像下载中间断开了互联网连接!所以我在sql中有不完整的记录!天哪

    然后我改为:我创建一个临时全局变量,例如tempvar={},然后:tempvar.data1='hello',tempvar.preparedatacompleted=true,tempvar.ImagesToBeDownload=5,tempvar.imagesdownload=0,tempvar.imagearray=

    然后,每次下载图像时,在数字上加1,如果该数字=总数,则调用将此tempvar中的所有数据和图像保存到sql的函数

    function checkCache (imgsrc){
        ImgCache.isCached(imgsrc, function(src, success) {
            if(!success){
                ImgCache.cacheFile(src, function(){});
            }
        });
    };