2014-12-16 3 views
1

순차적으로 다운로드하려는 URL 배열이 2 개 있습니다.배열에서 일련의 WinJS 약속을 순차적으로 실행합니다.

var urls = [url1,url2,url3,url4,url5];

루프 일부 비동기 함수 배열에 나타나는 순서대로 한번에 2 개 URL을 사용하여 모든 URL을 다운로드한다. 기본 순차적 루프를 다음과 같이 작동 .reduce를 사용하여 수행됩니다 :

preloadPromise = urls.reduce(function(p, url) { 
    return p.then(WinJS.Utilities.Scheduler.schedulePromiseBelowNormal).then(function() { 
    return preloadOneAsync(url); 
    }).then(null, function(error) { 
    if (error.name !== "Canceled") { 
     logger.error("Could not create preloaded " + url, error); 
    } 
    }); 
}, WinJS.Promise.as()); 

이 지금은 같은 시간에 두 URL을 병렬 다운로드를 소개하고자합니다.

그래서 그것을 다운로드 것 : [URL1을 URL2] 다음 [URL3은 url4] 마지막으로 [url5]

는 또한 함수의 결과가 어떻게 WinJS.Promise.join 작품과 유사한 모든 다운로드 약속의 결과이어야한다.

답변

2

하자 밖으로 추상적 인 함수는 튜플

function chunkBy(array, n) { 
    var chunks = []; 
    for (var i=0; i<array.length; i+=n) 
     chunks.push(array.slice(i, n)); 
    return chunks; 
} 

로 배열하고 각 항목에 대한 작업을 수행하는 기능을 깰 :

function tryToLoad(url) { 
    return WinJS.Utilities.Scheduler.schedulePromiseBelowNormal() // not sure 
    .then(function() { return preloadOneAsync(url); }) 
    .then(null, function(error) { 
     if (error.name !== "Canceled") { 
      logger.error("Could not create preloaded " + url, error); 
     } 
    }); 
} 

에서 여러 항목에 대한 작업을 수행하는 함수 평행은 단지

function loadAll(urls) { 
    return WinJS.Promise.join(urls.map(tryToLoad)); 
} 

이 될 것이므로 우리는 이것을 generatio 시퀀스들은 N :

preloadPromise = chunkBy(urls, 2).reduce(function(p, urls) { 
    return p.then(function(prevResults) { 
     return loadAll(urls).then(function(results) { 
      return prevResults.concat(results); 
     }); 
    }); 
}, WinJS.Promise.as([])); 

결과의 배열은 항상 각 단계 후에 성장은 p 체인을 통해 전달된다.

+0

감사합니다, 당신은 '약속의 사람'인 것 같습니다 :) 한 가지 : WinJS.Promise.Jin은 약속 중 하나라도 실패하면 실패합니다. 따라서 몇 초 후에 다시 시도 할 URL을 모르겠습니다. . – philk

+0

[그놈들] (http://stackoverflow.com/tags/promise/topusers) 중 하나만 :-) 예, 배열의 약속 중 하나라도 실패하면 'join'이 실패하지만 여기에는 관련이 없습니다 -'tryToLoad '* 결코 * 모든 오류를 포착하기 때문에 실패하지 않습니다. 오류 처리기는 어떤 URL이 실패했는지 나타내는 개체를 반환 할 수 있습니다. – Bergi

+0

그러나 오류 처리기는 'WinJS.Promise.wrapError (error)'와 같은 실패한 약속을 반환해서는 안됩니다. – philk