동기, 비동기, 프라미스

함수가 제대로 마무리될 수 있도록 수명 주기를 관리하는 것이 중요합니다. 함수를 올바르게 종료하면 함수가 너무 오래 실행되거나 무한 루프에 빠져 과도한 요금이 부과되는 일을 피할 수 있습니다. 또한 함수를 실행하는 Cloud Functions 인스턴스에서 함수가 종료 조건 또는 상태에 도달하기 전에 잘못 종료되지 않도록 할 수도 있습니다.

다음과 같이 함수의 수명 주기를 관리하는 것이 좋습니다.

  • 자바스크립트 프라미스를 반환하여 비동기 처리를 수행하는 함수('백그라운드 함수'라고도 함)를 확인합니다.
  • res.redirect(), res.send() 또는 res.end()HTTP 함수를 종료합니다.
  • return; 문으로 동기 함수를 종료합니다.

자바스크립트 프라미스로 비동기 코드 단순화

프라미스는 비동기 코드에 대한 콜백을 대체하는 최신 기능입니다. 프라미스는 하나의 작업과 해당 작업이 이후에 반환할 수 있는 값을 나타냅니다. 또한 동기식 코드의 try/catch와 비슷한 방식으로 오류를 전파할 수 있습니다. Firebase 블로그에서 Firebase SDK의 프라미스를 알아보고 MDN에서 일반 프라미스를 알아보세요.

프라미스와 함수의 연동

함수에 자바스크립트 프라미스를 반환하면 해당 함수는 프라미스가 해결 또는 거부될 때까지 계속 실행됩니다. 함수가 작업을 성공적으로 완료했음을 나타내려면 프라미스를 해결해야 합니다. 오류를 나타내려면 프라미스를 거부해야 합니다. 따라서 원하는 오류만 처리하면 됩니다.

다음 코드는 Firebase Realtime Database ref를 사용하여 값을 "world!"로 설정합니다. set 결과를 반환하면 데이터베이스에 문자열을 쓰는 비동기 작업이 완전히 완료될 때까지 함수가 계속 실행됩니다.

// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
  // set() returns a promise. We keep the function alive by returning it.
  return event.data.ref.set('world!').then(() => {
    console.log('Write succeeded!');
  });
});

관련 예시

대부분의 Cloud Functions 코드 샘플에는 적절한 함수 종료의 예가 포함되어 있습니다. 다음은 전형적인 경우를 보여주는 몇 가지 예입니다.