2016-06-04 1 views
3

약속에 bluebird를 사용하고 있으며 여러 파일의 내용을 가져 오려고합니다. 이 같은약속 내용으로 파일 이름 매핑 결과

result = { 'file1.md': content }

내가하려고했는데 뭔가 : 내가 원하는 그 파일 이름, 예와 함께 파일의 내용을 얻을 수있을 것입니다,

var files = [ 
    { filename: 'README.md', url: 'assetFiles/README.md' }, 
    { filename: 'CHANGELOG.md', url: 'assetFiles/CHANGELOG.md' }, 
    { filename: 'ISSUES_TEMPLATE.md', url: 'assetFiles/ISSUES_TEMPLATE.md' }, 
    { filename: 'PULL_REQUEST_TEMPLATE.md', url: 'assetFiles/PULL_REQUEST_TEMPLATE.md' }]; 

    return Promise.all(files.map(function(file) { 
    return [file.filename, fs.readFileAsync(file.url, 'utf-8')]; 
    })) 
    .then(function(results){ 
    console.log(results); 
    }; 

그러나 내가 이에서지고 있어요 것은 배열과 같은 : 나는 내용과 함께 파일 이름을 얻을 수있는 방법

result = [ ['file1.md', Promise ], ... ];

블루 버드를 사용하는 파일?

답변

3

것은 새로운 약속 (소위 "약속 생성자 안티 패턴")를 만들 필요 방지하려면

var result = Promise.all(files.map(function(file) { 
    return fs.readFileAsync(file.url, "utf-8") 
    .then(data => [file.filename, data]); 
}); 

result 
    .then(function(results){ 
    console.log(results); 
    }) 
    .catch(function(err) { 
    console.log(err); 
    }); 

return result; 
+0

는'.catch()'여기에 거부 "를 먹고"하고 반환하지 않습니다 로깅. – jfriend00

+0

감사합니다. –

+0

또한'Promise.map' 메소드가 있습니다. – undefined

3

귀하의 코드가 Promise.all()는 약속의 배열이 필요하기 때문에 작업하지만 '되지 다시 [data, promise] 배열을 전달하십시오. 따라서, 그것은 모든 개별 약속을 기다리는 법을 알지 못합니다.

Bluebird를 사용하고 있으므로 Promise.map()을 직접 사용할 수 있습니다. 그것은 자동으로 Promise.all()와 배열 .map() 반복을 결합 :

return Promise.map(files, function(file) { 
    return fs.readFileAsync(file.url, "utf-8").then(data => [file.filename, data]); 
});