당신이 정말 찾고있는 것은 .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]);
감사합니다. (여전히 "파이프"사용법을 이해하려고 노력함). 이 접근법이 더 좋다고 말하거나 둘 다 괜찮습니까? – sigmus
원래 방법의 문제점은 모든 요청이 완료 될 때 "지연"이 해결되는 것이 아니라 즉시 해결된다는 것입니다. .pipe를 사용하면 반환되는 지연은 전체 체인이 성공하거나 실패 할 때만 해결됩니다. 내 솔루션은 더 간결하게 만들 수 있지만 파이프를 사용하여 작업을 함께 연결합니다. http://api.jquery.com/deferred.pipe/#example-2 – dherman
감사합니다. 나는 "second.js"에서 404라는 파일이 호출되지 않으면 어떤 실험과 코드를 사용했다. 내 예가 여기에서 수정되었습니다. https://github.com/kriskowal/q#sequences – sigmus