2017-01-12 10 views
0

이 질문의 이름을 다소 고민했지만 다소 빨리 설명하려고합니다.Dropbox JS SDK : .then-function 내부에서 i ++를 실행하십시오.

Dropbox JavaScript SDK를 사용하여 특정 폴더에서 공유 링크를 검색하고 있습니다. 우선, 나는 폴더에서 파일을 검색하려면 다음 코드를 사용하고 있습니다 : 다음이 파일을 통해 루프 dbx.sharingGetSharedLinks(), dbx.filesGetTemporaryLink()뿐만 아니라 dbx.sharingGetSharedLinkFile()와 자신의 링크를 얻을 사용합니다

var DROPBOX_PATH = path; 
var ACCESS_TOKEN = '***'; 
var dbx = new Dropbox({ accessToken: ACCESS_TOKEN }); 

function listFiles() { 
    dbx.filesListFolder({ path: DROPBOX_PATH }) 
    .then(function(response) { 
     displayFiles(response.entries); 
    }) 
    .catch(function(error) { 
     console.error(error); 
    }); 

    return false; 
} 

. 문제는 폴더에 파일 몇 개가 들어있는 경우이 프로세스에 약간의 시간이 걸릴 수 있으며 진행률이 얼마나 떨어져 있는지 표시하려면 <progress> 요소를 사용하고 싶습니다.

첫째, 나는 dbx.sharingGetSharedLinkFile().then() 과정에서 바 가치를 진행 위에서 언급 한 세 가지 기능을 래핑하는 for(var i = 0; i < files.length; i++) 루프를 사용하고, i을 추가했지만, 그들은 동기화 아니에요 - i 값이 이전에 증가 모든 기능은 각각의 목적을 달성하고 무엇이든 출력 할 수 있습니다.

루프 대신 while() 루프로 바꾸고 마지막 dbx 함수 안에 i++을 넣으려고했지만 웹 브라우저가 과부하가되어 결국 무한 루프가 될 수 있습니다.

dbx.sharingGetSharedLinkFile().then()과 일치하여 i 값을 증가시킬 수있는 방법이 있습니까?


참고 : 다른 부분이 완전히 완료되지 않았고 조금 어색하기 때문에 여기에 가장 필수적인 코드를 작성합니다. 전체 소스 코드는 여기에 있습니다. http://paste.ofcode.org/HWdmBfjwRKSSpiRNVLsPcu

답변

0

예상되는 동작을 얻으려면주기 대신 함수를 사용해야합니다.

dropbox api 메소드 sharingGetSharedLinks의 콜백은 메인 루프가 파일 목록을 반복하여 계속하면서 (이 메소드 내부의) 드롭 박스 서버에 대한 비동기 요청이 완료된 후에 만 ​​실행되기 때문에 현재 코드가 예상대로 작동하지 않습니다.

마지막으로,이 약속에 대해 전부는 그래서 난이 링크 MDN about Promises 거의 코드 예제와 정확한 방향을 가리 키도록 시도 :

function displayFiles(files) { 

     //... your code 
     // i'll show you only changes 

     var i = 0; 

     (function listNextFile(){ 


      let file = files[i] 

      if (file) { 

      var name = file.name.slice(4).slice(0, -7).replace('_', '/'), 
       file_path = file.path_display; 

      dbx.sharingGetSharedLinks({ path : file_path }).then(function(response){ 

       // ... 
       // there is your code 
       // after all you need to icrease counter and call function again 

       i++ 
       listNextFile(); 

      }); 

      } 

     })() 

} 
0

귀하의 코드는 정말 지저분하다. es6 또는 q 라이브러리를 사용할 수있는 경우 이런 약속을 사용하십시오. 별도의

var promises = []; 
 
    
 

 
files.forEach((file) => { 
 
    promises.push(sharingGetSharedLinks(file_path).then(filesGetTemporaryLink(download_path)).then(sharingGetSharedLinkFile(download_url))); 
 
}); 
 

 
Promise.all(promises).then((values) => { 
 
// values are, an array of responses where each response is the three requests per each file 
 
});

이 요청 및 프로세스는, filesGetTemporaryLink 새로운 HTTP 요청을 sharingGetSharedLinks의 결과와 같은 일을하고 확인 후, 마지막에 대한 결과를 반환 sharingGetSharedLinks 각 요청에 대한 논리 하나는 프로세스를 반복하지만 결과는 filesGetTemporaryLink입니다.

그러면 모든 요청을 함께 처리 할 수 ​​있어야합니다. [r1, r2, ...] 여기서 r1은 SharedShareLinks, filesGetTemporaryLink 및 sharingGetSharedLinkFile에 대한 공유 프로세스 요청을 포함합니다.

하지만 모든 코드를 리팩터링해야합니다. 여기서는 사용 방법이 간단합니다. https://www.promisejs.org/patterns/