2014-09-01 2 views
0

저는 재귀 함수를 가지고 있으며 매 번 약속을 되 돌리는 순서로 실행하려고합니다. 코드는 재귀 적이며 잘 작동하지만 for 루프의 첫 번째 항목에서만 작동합니다.내부에서 for 루프를 사용하여 약속을 반환합니다.

예 :

  • 폴더 : 1 - OK
  • 폴더 : 11 -
  • 폴더 OK -
  • 폴더 OK 111 : 111 - OK
  • 폴더 : 2 - OK NOT
  • 폴더 : 12 - NOT OK
  • 모든 비동기 다운로드가 순서대로 완료되었습니다.

내가 내부에서 약속을 되 돌리면 for 루프가 중단되기 때문이라고 생각합니다.

function CopySubFolders(folder, destFolder) { 

    // Recursively copy each subfolder 
    return folder.getFoldersAsync() 
    .then(function (folderlist) { 
     if (folderlist.size > 0) { 
      for (var i in folderlist) { 
       var replace = Windows.Storage.CreationCollisionOption.replaceExisting; 
       console.log("create folder: " + folderlist[i].name); 

       return destFolder.createFolderAsync(folderlist[i].name, replace) 
       .then(function (newdest) { 
        return CopySubFolders(folderlist[i], newdest); 
       }); 
      } 
     } 
     else { 
      return WinJS.Promise.as(); 
     } 
    }); 
} 


CopySubFolders(folder, self.localFolder) 
.then(function() { 
    completeFunc("Done"); 
    console.log("All asynchronous downloads completed in sequence."); 
}) 

for 루프를 중단하지 않고 약속을 되 돌리는 방법을 알고 싶습니다.

추신 : 내가 forEach loo를 사용하면 중단되지는 않지만 순차적으로 폴더를 반환하는 기능이 느슨합니다.

예 :

  • 폴더 : 1 - OK
  • 순서대로 완료 모든 비동기 다운로드
  • .
  • 폴더 : 11-
  • 폴더 OK : -
  • 폴더 OK 111 : 111 - OK
  • 폴더 : 2 - OK
  • 폴더 : 12 - OK
+0

죄송 내가 감소와이 솔루션을 시도합니다 folderlist에게 –

답변

4

예, 단지 같은 모든 함수를 사용하여 return 문을 실행하면 함수가 수행중인 작업을 중단하고 반환합니다. 당신은 당신이 다음에 뭘 하려는지 달성 할 수 있어야한다 :

편집 : 특정 순서로 완료하도록 필요하지 않은 경우, 당신은 당신이 WinJS.Promise.join()으로 무엇을하려고 달성 할 수 (일명 Promise.all() 다른 약속 방언)과 map (나는 중첩 줄이려고 여기 안쪽 부분을 감안하고있어) :

function CopySubFolders(folder, destFolder) { 
    return folder.getFoldersAsync() 
    .then(function (folderlist) { 
     return WinJS.Promise.join(folderlist.map(function (folder) { 
      return CopyFolder(folder, destFolder); 
     }); 
    }); 
} 

function CopyFolder(folder, destFolder) { 
    var replace = Windows.Storage.CreationCollisionOption.replaceExisting; 
    console.log("create folder: " + folder.name); 

    return destFolder.createFolderAsync(folder.name, replace) 
      .then(function (newdest) { 
       return CopySubFolders(folder, newdest); 
      }); 
} 

완전한 사이드 참고로, 배열 for...in를 사용하지 마십시오. 나쁜 생각이야.여기

그리고이 게시물의 흔적을 조금 같은

은 (즉,하지 않는 것이 좋습니다하지만) 당신은 당신이 필요한 경우 순서로 폴더를 만들 수있을 것입니다 방법입니다

function CopySubFolders(folder, destFolder) { 
    var p = Promise.resolve(); 

    return folder.getFoldersAsync() 
    .then(function (folderlist) { 
     return folderlist.forEach(function (folder) { 
      var replace = Windows.Storage.CreationCollisionOption.replaceExisting; 
      console.log("create folder: " + folder.name); 

      p = p.then(function() {  
       destFolder.createFolderAsync(folder.name, replace) 
       .then(function (newdest) { 
        return CopySubFolders(folder, newdest); 
       }); 
      }); 
     }); 
    }); 

    return p; 
} 

또 다른 약간 청소기 here를 그림과 같이 같은 일을 할 수있는 방법은, folderlist.reduce()을 사용하는 것입니다

function CopySubFolders(folder, destFolder) { 
    return folder.getFoldersAsync() 
    .then(function (folderlist) { 
     return folderlist.reduce(function (sequence, folder) { 
      var replace = Windows.Storage.CreationCollisionOption.replaceExisting; 
      console.log("create folder: " + folder.name); 

      return sequence.then(function() {  
       destFolder.createFolderAsync(folder.name, replace) 
       .then(function (newdest) { 
        return CopySubFolders(folder, newdest); 
       }); 
      }); 
     }, Promise.resolve()); 
    }); 
} 
+0

thnkas를 수집 부분을 추가했다. 명령을 반환 할 필요가 없습니다. 마지막 호출이 완료되면 반환 할 함수가 필요합니다. –

+0

WinJS에서 Promise.resolve()를 어떻게 transklate합니까? WinJS.Promise.as()입니까? –

+0

고쳐 주셔서 감사합니다. OP :'Promise.resolve'는 실제로'WinJS.Promise.as'입니다. –

관련 문제