2012-10-26 5 views
1

임의의 수의 스크립트를 실행해야합니다. 다음의 것만이 이전에로드되고 실행 된 것만 실행할 수 있습니다. 나는 RequireJS가 (관련) 올바른 선택이 될 것입니다 알고,하지만 난 약속에 대해 배우려고 노력하고있어, 그래서 이것은 내 실험입니다 :map/reduce 및 jQuery를 사용하여 순차적으로 임의의 스크립트를 실행하십시오.

var files = [ 
    'first.js', 
    'second.js', 
    'third.js', 
    'fourth.js' 
]; 

var funcs = files.map(function(file) { 
    return function() { return $.getScript(file); } 
}); 

var deferred = $.Deferred(); 

funcs.reduce(function (soFar, f) { 
    return soFar.then(f); 
}, deferred.resolve(funcs[0])); 

누군가가 내 솔루션에 함정과 대안에 대해 자세히 설명 할 수 있습니까?

답변

1

당신이 정말 찾고있는 것은 .pipe (또는 1.8 이상에서, 나는 그 때는 같은 것을 의미하는 것으로 변경되었습니다 생각) 한마디로

을, 파이프 방식으로 체인 약속을 허용 할 것이다 당신을 찾고있어. 코드는이 (안된)과 같이 보일 수 있습니다

var files, scriptsLoaded; 

files = [ 'first.js', 'second.js', 'third.js', 'fourth.js' ]; 

while(files.length) { 
    (function() { 
     var currentUrl = files.shift(); 

     scriptsLoaded = scriptsLoaded ? 
      scriptsLoaded.pipe(function() { 
       return $.getScript(currentUrl); 
      }) : 
      $.getScript(currentUrl); 
    }()); 
} 

$.when(scriptsLoaded).done(function() { 
    // All scripts are now loaded assuming none of them failed 
}); 

** 당신이 제공하는 링크로 편집 **

, 당신이 달성하려고 한 것을 이해합니다. 다음은 몇 가지 의견이있는 해결책의 수정 된 버전입니다. 다른 솔루션과 동일한 작업을 수행하지만 훨씬 간결한 버전입니다.

var files = [ 'first.js', 'second.js', 'third.js', 'fourth.js' ]; 

// The initial value provided to the reduce function is a promise 
// that will resolve when the first file has been loaded. For each 
// of the remaining file names in the array, pipe it through that first 
// promise so that the files are loaded in sequence (chained). 
// The value that is returned from the reduce function is a promise 
// that will resolve only when the entire chain is done loading. 
var scriptsLoaded = files.slice(1).reduce(function (soFar, file) { 
    return soFar.pipe(function() { 
     return $.getScript(file); 
    }); 
}, $.getScript(files[0]); 
+0

감사합니다. (여전히 "파이프"사용법을 이해하려고 노력함). 이 접근법이 더 좋다고 말하거나 둘 다 괜찮습니까? – sigmus

+0

원래 방법의 문제점은 모든 요청이 완료 될 때 "지연"이 해결되는 것이 아니라 즉시 해결된다는 것입니다. .pipe를 사용하면 반환되는 지연은 전체 체인이 성공하거나 실패 할 때만 해결됩니다. 내 솔루션은 더 간결하게 만들 수 있지만 파이프를 사용하여 작업을 함께 연결합니다. http://api.jquery.com/deferred.pipe/#example-2 – dherman

+0

감사합니다. 나는 "second.js"에서 404라는 파일이 호출되지 않으면 어떤 실험과 코드를 사용했다. 내 예가 여기에서 수정되었습니다. https://github.com/kriskowal/q#sequences – sigmus