2017-05-10 3 views
0

Chrome WebServer AddOn에서 실행되는 브라우저 도구를 만들고 있습니다. 서버는 GET 요청을 JSON 배열 (isFolder/isFile/filename 값 포함)로 반환하여 디렉터리 파일을 제공합니다.

이 폴더의 모든 파일을 검사해야하는 폴더 목록이 있습니다. pushArray에서 리턴되어야하는 서브 디렉토리.

이제 대개 반복적 인 함수를 사용하여이 작업을 반복합니다. $.get을 사용할 때 나는 비동기 요청을 가지고 있으며 그때까지 반복하고 모든 파일 목록을 반환하는 방법을 모릅니다. 나는 .when().done()으로 시도했지만 재귀 대신에 그것을하는 방법에 대한 생각이 부족하다고 생각합니다.

다음 코드는 작동하지 않으며 이해하지만 왜 내가 지금까지했던 : 배열에 나열된 모든 파일이 포함

function recursiveFileRead(data, pushArray) { 
    var val = data; //data contains 
    val = String(val).trim() + "?json=1" //required so the server gives back the json object 

    //get list of files and folder in a json object (async!) 
    var callBack = $.get(val, function(val) { 
    json = val; 

    //loop through json object. 
    $.each(json, function(i, value) { 
     //if file push to array 
     if(value.isFile) { 
     pushArray(value.filename); 
     } else { 
     //if folder recursively run through the subfolders 
     recursiveFileRead(data, pushArray) 
     }; 
    }); 
    }); 

    $.when(callBack()).done(function() { 
    //return pushArray 
    }); 

} 

후, 나는 그 파일을 ZIP하는 작업을 수행해야합니다. 나는이 동기를 수행 할 수 없을 것 같아요,하지만 내가 비동기 적으로 반복한다면 내가 어떻게 완료되었는지 알 수 있습니까?

고맙습니다.

+0

을 기반으로? –

답변

0

그래서 (아주 나쁜) 해결책이 있습니다. 나는 여전히 변수를 "재귀 적으로"전달할 수 없기 때문에 (전역 변수를 사용하기 위해 하나의 배열에 새로운 데이터를 추가하고있다). 또한 모든 약속이 해결되어 현재 타이머를 사용하고 있어도 발사 할 수 없습니다. 적어도 내가 원하는 데이터를 얻지 만 도움이된다면 :

첫 번째 "정규 코드"에서 폴더를 확인할 파일/폴더가 포함 된 목록을 반복합니다. 폴더가 있다면, 나는 "재귀"비동기 함수를 호출 오전 : 당신이 코멘트에서 볼 수 있듯이, 약속에 대한 when.apply.done이 fireing되지

//go through items listed and check if file/folder 
    $.each(data, function(i, value) { 
    //get file ending 
    var extn = value.split(".").pop(); 

    //use array defined before to check 
    if (validFormats.indexOf(extn) == -1) { 
     console.log("folder: " + value); 
     //folder - start recursive directory list 
     promises.push(requestAll(value)); 
    } else { 
     pushArray.push(value); 
     console.log("file: " + value); 
    } 
    }); 

    console.log(promises); //<= logs the promises 
    $.when.apply($, promises).done(function(responses) { 
    alert("done"); //<= doesn't fire 
    console.log(responses); 
    }); 

    setTimeout(function() { 
    alert(pushArrayGlobal.join("\n")) 
    }, 3000); 

을, 제한 시간은 않습니다 내가 얻을 필요한 데이터의 전체 목록입니다.

파일을 나열하는 다음 코드는 "반복적으로"어떤 생각을 가지고 아무도 https://stackoverflow.com/a/23355670/4178195

function request(data) { 
    // return the AJAX promise 
    return $.ajax({ 
    url: data + '/?json=1', 
    method: 'GET', 
    dataType: 'json' 
    }); 
} 


function requestOddsFrom(folder, items) { 

    return request(folder).then(function(data) { 
    $.each(data, function(i, value) { 
     console.log(value); 
     var newArray = []; 
     console.log(value.name); 
     //if folder 
     if (value.isDirectory) { 
     //remove first folder of relative path and call request again 
     requestOddsFrom(value.fullPath.split('/').slice(2).join('/'), []); 
     //if file add to pushArrayGlobal 
     } else { 
     pushArrayGlobal.push(value.fullPath); 
     } 
    }); 
    }); 
} 

function requestAll(data) { 
    return $.Deferred(function() { 
    var self = this; 
    $.when(requestOddsFrom(data, [])).then(function(items) { 
     self.resolve(pushArrayGlobal); 
    }); 
    }); 
}