2017-11-09 6 views
0

나는 개념 문제와 관련된 비동기이 기다리고 코드 : 이것은 내가 내 코드에있는 코드 조각입니다 :재귀 적 약속 거부를 처리하는 방법은 무엇입니까?

라인은

는 file.save()을 기다리고

async function uploadFileBackup(fileId, versionNumber, filePath, sync) { 
//...some irrelevant code 
const toReturn = new Promise((accept, reject) => { 
    s3.upload(params, async function (err, data) { 
     if (err) { 
     reject(err) 
     } else { 
     //here is the relevant code 
     file.backupStatus = 'success' 
     await file.save() 
     accept(data) 
     } 
    }) 
    }) 

    if (sync) 
    return toReturn 
//...some other irrelevant code 
} 

이제 경우

(그 약속 성공에 일어나는), 그럼 내 애플은 던져 처리 실패 약속을 거절 그리고 이것은 정확히 내 문제입니다.

또한 수락 메서드를 허용하면 약속의 처리되지 않은 거부가 발생합니다.

나는 자연스럽게 시도 캐치 블록과 else 문에서 코드를 둘러싸고 수 있지만, 그 오류가 약속 코드 S3에서 오는 생각하기 때문에 그 도움이되지 않습니다, 더, 그것은 개발자를 오도 할 것이다. 그 부분이 성공한 반면,을 업로드하고 받아 들일 코드는 실패 하나가 될 것입니다 : 확실히 다른 결과가 있습니다

  • S3 업로드 실패 파일이
  • 하지만 파일을 업로드하지 않았 음을 의미합니다. save() 실패는 db의 파일 상태가 업데이트되지 않았 음을 의미하지만 물리적 파일이 s3 시스템에 있습니다.

두 가지 오류는 동일한 try catch 블록에서 처리 할 수 ​​없지만 accept 메소드에서 발생하는 상황을 포착하는 것도 (장면 뒤에서 일어난 일에 대해) 분명하지 않습니다. 마지막으로, 콜백 약속 교량의 try catch 블록을 추가하는 코드 가독성

을 complexifies 그래서 가장 좋은 방법은이 경우에 어떤

+0

"전달 된 accept 메서드가 예외를 throw하는 경우 *"- 절대 해당하지 않습니다. – Bergi

답변

3

당신은 Promise constructor antipattern을 피할 필요! 그리고 async 함수를 반환 값을 무시하는 함수에 대한 일반 콜백으로 전달하면 안되므로 반환 된 약속의 오류를 처리하지 않아야합니다.

대신 promisifys3.upload 혼자

function upload(params) { 
    return new Promise((resolve, reject) => { 
    s3.upload(params, (err, data) => { 
     if (err) reject(err) 
     else resolve(data) 
    }) 
    }) 
} 

하고 또한 당신이 유일한 조건 기다린다 약속 (if (sync))와 달리 forgotten about without handling errorstoReturn을 만들지 않도록해야

async function uploadFileBackup(fileId, versionNumber, filePath, sync) { 
    … // some irrelevant code 
    if (sync) { 
    const result = await upload(params) 
    file.backupStatus = 'success' 
    await file.save() 
    return result 
    } 
    … // some other irrelevant code 
} 

처럼 사용해야합니다.

지금 await upload 또는 await file.save에서 오류를 처리하려면

당신은 try/ catch에서 그들을 포장 또는 whatever is appropriate을 할 수 있습니다. 당신이 그들을 다룰 수 없다면, 그들은 uploadFileBackup에 의해 반환 된 약속을 거절 할 것이고, 그 발신자에 의해 어딘가에서 처리 될 필요가있다. 그러나 그것들은 길잃은 약속들로부터 처리되지 않은 거부를 가져 오지 않을 것이다.

+0

즉, 해결 방법은 관련성이없는 내용을 수행해서는 안됩니다.이것은 약속 결정 이후에 오는 논리를 반복해야한다는 것을 의미합니다. 호출 자체에 논리를 바인딩 할 수 없습니다. –

+0

또한이 메서드는 비동기 적으로 호출 될 수 있으므로 요청을 차단하지 않아야합니다. 따라서 매개 변수 동기화가 제안됩니다. –

+1

잘 모르겠습니다. "해결 방법"의 의미는 무엇입니까? 네,'s3.upload'에 전달한 콜백은 약속 만 해결하고 다른 일은하지 말고 다른 모든 일은'then' 콜백 (또는'await' 후에)에서 일어나야합니다. – Bergi