Q.all([
promise1,
promise2,
.
.
.
promiseN,
]).then(results) {
// results is a list of all the values from 1 to n
});
그러나 단 하나의, 가장 빠른 완성도의 결과에만 관심이 있다면 어떻게됩니까? 유스 케이스를 제공하려면 : 큰 파일 목록을 검토하는 데 관심이 있고 "짐바브웨"라는 단어가 포함 된 파일을 찾으면 곧 만족합니다.
나는 이런 식으로 작업을 수행 할 수 있습니다
Q.all(fileNames.map(function(fileName) {
return readFilePromise(fileName).then(function(fileContents) {
return fileContents.contains('zimbabwe') ? fileContents : null;
}));
})).then(function(results) {
var zimbabweFile = results.filter(function(r) { return r !== null; })[0];
});
하지만 난 이미 "짐바브웨"발견 한 경우에도 모든 파일을 처리 할 때 필요합니다. "짐바브웨"가 들어있는 2kb 파일과 "짐바브웨"가 들어 있지 않은 30tb 파일이있는 경우 (그리고 파일을 비동기식으로 읽는다고 가정합니다) - 바보입니다! "짐바브웨는"발견 된 경우 내 30TB 파일에서 대기하지 않습니다이 방법
Q.any(fileNames.map(function(fileName) {
return readFilePromise(fileName).then(function(fileContents) {
if (fileContents.contains('zimbabwe')) return fileContents;
/*
Indicate failure
-Return "null" or "undefined"?
-Throw error?
*/
}));
})).then(function(result) {
// Only one result!
var zimbabweFile = result;
}).fail(function() { /* no "zimbabwe" found */ });
: 내가 할 수 있기를 원하는 것은
는 값 어떤 약속이 충족되는 순간을 얻을 수있다 내 2kb 파일을 일찍.
그러나 Q.any
과 같은 것은 없습니다!
질문 : 어떻게해야합니까?
중요 사항 : 내부 약속 중 하나에서 오류가 발생하더라도 오류없이 반환되어야합니다.
참고 : 첫 번째 유효한 값을 찾을 때 오류가 발생하여 Q.all
을 해킹 할 수 있음을 알고 있지만이를 피하기를 원합니다.
참고 : Q.any
과 같은 동작이 잘못되었거나 부적절 할 수 있음을 알고 있습니다. 유효한 유스 케이스가 있다고 믿으십시오!
Q가 지원한다면 당연히 몰라.하지만 본래의 약속은 확실히 그렇습니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race –
@KevinB 좋은 지적, 고정! Q와 기본 약속을 혼합하는 것이 좋지 않다고 생각합니까? 이것에 대한 합의가 무엇인지 아십니까? –
@KevinB 다른 뉴스에서 실제로 Q.race와 같은 것이 있습니다 - 문서화되지 않았지만 존재합니다. 답변을 추가하면 수표를드립니다! –