2016-08-19 4 views
0

node.js 환경에서 Bluebird 약속을 사용하여 파일의 가능한 3 가지 변형이 있는지 확인합니다 (image.png/image.gif/image .jpg) 내 서버에. 이 세 파일 중 하나가 있으면 그 파일은 사용자에게 반환됩니다. 세 파일 중 하나라도 존재하지 않으면 기본 이미지가 반환됩니다. 지금까지,이 코드를 내놓았다 :Node.js Bluebird 약속 : promise.any가 기본 이미지를 반환합니다.

var promise1 = new Promise(function(resolve, reject) { 
    fs.statAsync('./image.jpg') 
    .then(function(result) { 
     if(result){ 
      resolve('jpg'); 
     } 
    }).catch(function(err){ 
     //foo 
    });  
}); 

var promise2 = new Promise(function(resolve, reject) { 
    fs.statAsync('./image.gif') 
    .then(function(result) { 
     if(result){ 
      resolve('gif'); 
     } 
    }) 
    .catch(function(err){ 
     //foo 
    });  
}); 

var promise3 = new Promise(function(resolve, reject) { 
    fs.statAsync('./image.png') 
    .then(function(result) { 
     if(result){ 
      resolve('png'); 
     } 
    }) 
    .catch(function(err){ 
     //foo 
    });  
}); 

Promise.any([ 
    promise1, 
    promise2, 
    promise3 
]).then(function(result) { 
    res.sendfile("./image."+result); 
}).catch(function(err){ 
    res.sendfile("./default.png"); 
}); 

문제는 다음과 같습니다만큼 그 세 파일 중 하나가 존재하는 한, 모든 것이 잘 작동합니다. 그러나 세 파일 중 어느 것도 찾을 수없는 경우에 대비하여 반환 할 기본 이미지를 유지하도록 할 수는 없습니다.

+1

이미지가없는 경우 각 약속에'reject'를 사용해야합니다. –

+0

'fs.statAsync()'가 이미 반환 한 것을 사용할 수있을 때이 새로운 약속을 만드는 것은 안티 패턴입니다. '.then()'핸들러에서 결과를 평가하고 원하는 경우 해결 된 상태를 변경할 수 있습니다. 이것들을 새로운 약속으로 포장 할 필요가 없습니다. 사실, 여러 가지 버그는 불필요하고 실수하기 쉬운이 약속 포장으로 인해 발생합니다. – jfriend00

답변

1

statAsync은 이미 Promise을 반환하므로 직접 만들 필요가 없습니다 (an antipattern). 당신은 단순히 당신이 원하는 값으로 해결 Stats 값을 매핑하면

질문에 대해 게시 된 댓글에서 언급 한 바와 같이
var promise1 = fs.statAsync('./image.jpg') 
    .then(function() { return 'jpg'; }); 

var promise2 = fs.statAsync('./image.gif') 
    .then(function() { return 'gif'; }); 

var promise3 = fs.statAsync('./image.png') 
    .then(function() { return 'png'); }); 

Promise.any([ 
    promise1, 
    promise2, 
    promise3 
]).then(function(result) { 
    res.sendfile("./image."+result); 
}).catch(function(err){ 
    res.sendfile("./default.png"); 
}); 

, 코드가 아닌, 당신은 등 약 resolvereject 호출을 걱정할 필요가 없습니다 statAsync이 실패하면 Promise을 거부하지 않으므로 처음에는 직접 Promise을 만들지 않아도되기 때문에 작동합니다.

+0

반 패턴을 사용하여 죄송합니다. 나는 더 잘 알아야한다. 때때로 나는 약속의 개념과 해결/거절 된 사건의 통과에 아직도 어려움을 겪고 있습니다. 사실, 위의 코드는 왜 작동합니까? 내 말은, 거부하거나 던지라는 명령이 없다는 뜻입니다. 왜 캐치가 작동하지?! : -/ –

+0

SO 답변 - 훨씬 적은 코멘트 - 실제로 어떻게/왜 약속이 작동하는지 설명하는 가장 좋은 장소는 아닙니다. 그러나 위의 코드는'statAsync' 구현이 약속을 해석하거나 거부하기 때문에 작동합니다.'Promise.any' 구현은'then'과'catch' 호출을 연결합니다. 배열의 모든 약속이 거부되면 'Promise.any'에 연결된 'catch'가 호출됩니다. 배열의 단일 약속이 해결되면 'Promise.any'에 연결된 'then'이 호출됩니다. 다른 곳에 소개/설명 정보를 찾는 데 문제가 없어야합니다. – cartant

관련 문제