promise 연결

Promise 연결(HTML)

[ 이 문서는 Windows 런타임 앱을 작성하는 Windows에서 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]

Promise를 사용하는 방식은 다양합니다. 우선 이전 then 함수에서 반환되는 promise에서 then 또는 done을 호출하여 promise 작업을 연결할 수 있습니다. 또한 작업의 진행 상황을 추적하고 매개 변수로 then 또는 done에 전달하는 다른 함수에서 오류를 처리할 수도 있습니다.

작업의 중간 단계(예: .then().then())에는 then을 사용하고, 작업의 마지막 단계(예: .then().then().done())에는 done을 사용합니다. thendone의 차이점은 다음과 같습니다.

  • then은 promise를 반환하므로 여러 then 함수를 연결할 수 있습니다. 그러나 둘 이상의 done 메서드를 연결하면 undefined가 반환되므로 연결할 수 없습니다.

  • done에 오류 처리기를 제공하지 않은 경우 작업에 오류가 있으면 이벤트 루프에 예외가 발생합니다. 이는 try/catch 블록 내에서는 예외를 catch할 수 없지만 window.onerror에서 예외를 catch할 수 있음을 의미합니다. 반면, then에 오류 처리기를 제공하지 않은 경우 작업에 오류가 있으면 예외가 발생하지는 않지만 오류 상태로 promise를 반환합니다.

  • 따라서 중첩된 promise 체인보다는 단일 promise 체인을 사용해야 합니다. promise 체인에 서식을 지정하면 읽기가 쉬워지며 promise 체인에서 오류를 처리하기도 훨씬 쉽습니다.

    해야 할 것:

    
    aAsync()
        .then(function () { return bAsync(); })
        .then(function () { return cAsync(); })
        .done(function () { finish(); });
    
    
    

    금지 사항:

    
    
    // Bad code!
    aAsync().then(function () {
        bAsync().then(function () {
                cAsync().done(function () { finish(); });
        })
    });
    
    
    

아래 예제에서는 promise를 반환하는Windows 런타임 메서드를 연결하지만 JavaScript용 Windows 라이브러리 promise도 연결할 수 있습니다.

비동기 함수 변경

다음 예제에서는 두 개의 비동기 메서드 createFileAsyncstartAsync, 연결된 then 함수를 사용하여 웹 페이지를 파일로 다운로드하는 방법을 보여 줍니다.

이 예제에서 첫 번째 then 함수는 결과를 가져와 완료 처리기 함수에 전달합니다. BackgroundDownloader는 다운로드 작업을 만들고 startAsync 메서드는 다운로드를 시작합니다.

startAsync 메서드는 promise를 반환하므로 첫 번째 완료 처리기에서 startAsync 메서드의 값을 반환하여 두 번째 then 함수를 연결할 수 있습니다. 두 번째 then 함수에서는 매개 변수에 다운로드 작업이 포함된 완료 처리기를 추가합니다.



WinJS.Utilities.startLog();

// Assign the URI to download from.
var uriExample = new Windows.Foundation.Uri("http://www.microsoft.com");

// Get the folder for temporary files.
var tempFolder = Windows.Storage.ApplicationData.current.temporaryFolder;

// Create the temp file asynchronously.
tempFolder.createFileAsync("tempfile.txt", Windows.Storage.CreationCollisionOption.replaceExisting)
    .then(function (tempFile) {
        // The createFileAsync call succeeded, so start the download operation.
        var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();
        var transfer = downloader.createDownload(uriExample, tempFile);
        return transfer.startAsync(); 
    })
    .then(
        //Define the function to use when the download completes successfully
        function (result) {
            WinJS.log && WinJS.log("File download complete");
        });


진행 상황 추적 및 오류 처리

progress 함수를 제공하여 비동기 작업의 진행 상황을 추적하고, error 함수를 제공하여 오류 상태에 대한 세부 정보를 볼 수 있습니다. 진행 상황 알림 및 오류 처리를 위한 처리기 함수를 할당하려면 then 또는 done을 사용합니다.

다음 예제에서는 진행 상황 및 오류 처리기와 함께 startAsync 함수를 사용하여 웹 페이지를 비동기식으로 파일로 다운로드하는 방법을 보여 줍니다.



 // Assign the URI to download from.
var uriExample = new Windows.Foundation.Uri("http://www.microsoft.com");

// Get the folder for temporary files.
var tempFolder = Windows.Storage.ApplicationData.current.temporaryFolder;

// Create the temp file asynchronously.
tempFolder.createFileAsync("tempfile.txt", Windows.Storage.CreationCollisionOption.replaceExisting)
   .then(function (tempFile) {
       // The createFileAsync call succeeded, so start the download operation.
       var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();
       var transfer = downloader.createDownload(uriExample, tempFile);
        return transfer.startAsync(); 
   })
   .then(
       //Define the function to use when the download completes successfully
       function (result) {
           WinJS.log && WinJS.log("File download complete");
       },
       // Define the error handling function.
       function (err) {
           WinJS.log && WinJS.log("File download failed.");
       },
       // Define the progress handling function.
       function (progress) {
           WinJS.log && WinJS.log("Bytes retrieved: " + progress.progress.bytesReceived);
       });


startAsync 함수에 보고서에 대한 업데이트가 있으면 진행 상황 및 중간 결과 개체와 함께 진행 상황 처리기를 호출합니다. 비동기 작업 중 오류가 발생할 경우 완료 처리기 대신 오류 처리기가 호출됩니다.

관련 항목

JavaScript의 비동기 프로그래밍

 

 

표시:
© 2017 Microsoft