2015-01-23 1 views
0

로컬 하드 드라이브에서 이미지를 가져오고 싶습니다. 내 함수는 정의되지 않은 값을 반환합니다. StorageFolder.getItemAsync 같은 비동기 API 호출을 사용하여 작업하는 경우함수에서 winJS 반환 값이 정의되지 않았습니다.

function getImageFromLocal() { 
    var imageurl = 0; 
    return new WinJS.Promise(function() { 
     picturesLib.getItemAsync("APP Folder X").then(function (appfolder) { 
      appfolder.getItemAsync("Subfolder X").then(function (file) { 
       file.getItemAsync("Image.jpg").done(function (image) { 
        imageurl = URL.createObjectURL(image); 
       }); 
      }); 
     }); 
    }); 
    return imageurl; 
} 

답변

0

, 그것은 지역 변수에 궁극적 인 결과를 할당하고 그 반환을 시도 작동하지 않습니다.

또한 코드에는 두 개의 return 문이 있으며 그 중 첫 번째 문은 .done으로 끝나는 약속 체인의 반환 값으로 래핑 된 약속을 반환합니다.이 약속은 사용자에게 정의되지 않은 내용을 제공합니다. 두 번째 return 문은 절대로 도달하지 않으며이 경우에도 비동기 코드가 실행되지 않기 때문에 초기 값인 0을 반환합니다.

새로운 WinJS.Promise를 사용하면 원하는 부분이 아니라는 점을 자세히 지적 하겠지만 세부 사항은 자세히 설명하지 않겠습니다. 약속에 대한 전체적인 내용과 작동 방식을 원하면 제 3 장 (기본)과 부록 A (전체 기사)에서 무료 전자 책 Programming Windows Store Apps with HTML, CSS, and JavaScript, Second Edition을 참조하십시오.

코드로 돌아가서, 나는 당신이 무엇을하려고하는지 완전히 모르겠습니다. "Local"이라는 함수를 사용하면 앱 데이터에서 이미지를 검색하려고 시도하지만 picturesLib이라는 변수를 사용하면 그림 라이브러리에서 가져 오는 것으로 나타납니다. 나는 그것들 각각을 개별적으로 다룰 것이다.

먼저 로컬 appdata로 작업하는 경우 ms-appdata : /// local/folder1/folder2/image 형식의 URI를 사용하여 여기에 표시된 전체 프로세스를 무시할 수 있습니다. jpg. 그러한 URI를 img.src 속성에 직접 할당 할 수 있습니다. 이 작업은 동 기적으로 작동하며 인 패키지 리소스를 참조하는 ms-appx : /// URI에서도 작동합니다.

둘째, 이미지를 사용할 때 URI를 사용하여 편리하게 참조 할 수없는 경우 StorageFile을 가져 와서 URL.createObjectURL에 전달해야합니다.이 결과는 img.src에도 할당 할 수 있습니다. 너도 알 것 같아. 그러나 문제를 줄이려면 StorageFile.getFileAsync과 완전한 상대 경로를 사용할 수 있습니다. 이 방법을 사용하면 폴더 구조를 탐색하고 모든 호출을 단일 호출로 축소하는 약속 체인을 작성하지 않아도됩니다. , 약속 자체를 반환 할 필요있어,

picturesLib.getFileAsync("App folder X\subfolder x\image.jpg"); 

을 이제 누구의 목적으로 해당 이미지에 대한 URI를 반환하는 것입니다 원래의 기능을 위해 : pictureLib이 Windows.Storage.KnownFolders.picturesLibrary에서 StorageFolder 인 경우 그 다음 방금 사용할 수있다 호출자가 그 결과를 얻기 위해 약속을 지켰 음을 나타냅니다. getFileAsync에 대해 완성 된 핸들러 내에서 원하는 값을 반환하면 제대로 수행되지만 반환 값에 대한 약속을 반환하는 .then을 사용해야합니다 (.done은 정의되지 않음을 반환합니다).

function getPicturesLibUriAsync(relativePath) { 
    return picturesLib.getFileAsync(relativePath).then(function (file) { 
     return URL.createObjectURL(file); 
    }); 
} 

그런 다음 당신은 비동기 결과를 얻을되는 .done를 사용하여,이 같은 메소드를 호출

getPicturesLibUriAsync("folder1\folder2\image1.jpg").done(function (uri) { 
    someImageElement.src = uri; 
}); 

는 다시, 약속, 특히 반환 값을 사용하여 작업 방법에 대한 자세한 내용은 내 책을 참조 . 그럼.

+0

상세한 응답을 해주셔서 감사합니다. @Kraig Brockschmidt - MS, 저는 매우 좌절하고 혼란 스러웠습니다. 이제는 저에게 더 명확합니다. 하위 폴더의 모든 이미지를 선택하기위한 팁을 줄 수 있습니까? – Schnickers

+0

폴더 및 파일 쿼리라는 것을 조사하십시오. 폴더 및 폴더 쿼리 섹션의 https://msdn.microsoft.com/en-us/library/windows/apps/jj835814.aspx 및 제 11 장을 참조하십시오. –