JavaScript Promise: 알아야 할 기본 사항

Patricia Arquette
풀어 주다: 2024-09-29 20:18:31
원래의
589명이 탐색했습니다.

JavaScript Promises: The Basics You Need to Know

소개

JavaScript는 단일 스레드 프로그래밍 언어입니다. 즉, 한 번에 하나의 작업만 실행할 수 있습니다. 데이터 가져오기 또는 타이머 설정과 같은 비동기 작업의 경우 이는 까다로워지며, 이로 인해 실행 흐름이 차단되고 앱 속도가 느려질 수 있습니다.

스레드를 정지하지 않고 이러한 비동기 작업을 처리하려면 비동기 프로그래밍을 단순화하는 강력한 도구인 Promise를 만나보세요. Promise를 사용하면 장기 실행 작업을 더 효과적으로 관리하고, 더 깔끔하고 읽기 쉬운 코드를 작성하고, 두려운 "콜백 지옥"

을 피할 수 있습니다.

이 글에서는 프라미스가 무엇인지, 어떻게 작동하는지, 비동기 프로그래밍을 어떻게 단순화하는지 알아보고자 합니다.

약속이란 무엇입니까?

식당에서 식사를 주문한다고 상상해 보세요. 주문을 하고 나면 음식이 준비될 때까지 주방에서 기다리지 않아도 됩니다. 대신 주방에서 식사를 준비하는 동안 대화를 나누거나 분위기를 즐기세요. 레스토랑은 음식이 준비되면 제공하겠다고 약속합니다. 결국에는 식사가 도착하거나(이행) 주방에서 주문을 완료할 수 없다고 알려(거부됨) 중 하나가 발생하기 때문에 이 약속을 신뢰할 수 있습니다. ).

JavaScript에서 Promise는 비슷한 방식으로 작동합니다. 서버에서 데이터를 가져오는 등 시간이 걸리는 작업을 JavaScript에 요청하면 Promise가 반환됩니다. 이 약속은 바로 결과를 주지는 않습니다. 대신 "작업이 완료되면 다시 연락드리겠습니다."라는 메시지가 표시됩니다. 그 동안 나머지 코드는 계속 실행됩니다. 작업이 완료되면 약속은 다음 중 하나입니다.

  • 완료(작업 성공) 또는
  • 거부(작업 실패), 그에 따라 결과를 처리하시면 됩니다.

JavaScript에서 약속이 작동하는 방식

약속은 현재, 미래에 사용할 수 있거나 전혀 사용할 수 없는 값을 나타냅니다. 세 가지 상태가 있습니다:

  • 보류: 작업이 아직 진행 중이며 최종 결과(성취 또는 거부)가 아직 결정되지 않았습니다.
  • 완료: 작업이 성공적으로 완료되었으며 결과를 확인할 수 있습니다.
  • 거부됨: 작업이 실패했으며 오류를 처리할 수 있습니다

1. 약속 만들기

Promise를 생성하려면 Promise 생성자를 사용합니다. 이 생성자는 두 가지 매개변수(Resolve 및 Reject)가 있는 함수(실행자로 알려짐)를 사용합니다. Promise가 이행되면 Resolve 함수가 호출되고, 거부되면 Reject 함수가 호출됩니다.

const myPromise = new Promise((resolve, reject) => {
  // Simulating an asynchronous task (e.g., fetching data)
  const success = true; // Simulate success or failure

  if (success) {
    resolve("Operation completed successfully!"); // Fulfill the promise
  } else {
    reject("Operation failed."); // Reject the promise
  }
});
로그인 후 복사

2. 약속 해결 및 거부

Promise가 생성되면 다음과 같이 해결 또는 거부를 호출하여 결과를 결정할 수 있습니다.

  • 해결(값): 비동기 작업이 성공적으로 완료되면 이 함수를 호출합니다. Promise가 이행되기를 기다리는 핸들러에게 값을 전달합니다.
  • Reject(error): 작업이 실패하면 이 함수를 호출합니다. Promise가 거부되기를 기다리는 핸들러에 오류 메시지를 전달합니다.

3. 약속의 소비

Promise를 생성한 후 다음 단계는 이를 사용하는 것입니다. JavaScript는 Promises의 결과를 처리하기 위한 여러 메서드(.then(), .catch() 및 .finally())를 제공합니다. 이러한 각 방법은 특정 목적을 수행하며 비동기 작업의 결과를 효과적으로 관리할 수 있게 해줍니다.

  • .then()을 사용하여 해결된 Promise 처리: .then() 메서드는 Promise가 이행될 때 어떤 일이 발생해야 하는지 지정하는 데 사용됩니다. 해결된 값에 대한 콜백과 거부 처리를 위한 콜백이라는 두 가지 선택적 인수가 필요합니다.
const fetchData = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("Data fetched successfully!");
    }, 1000);
  });
};

fetchData()
  .then(result => {
    console.log(result); // Logs: Data fetched successfully!
  });
로그인 후 복사
  • .catch()를 사용하여 거부 처리: .catch() 메서드는 Promise 실행 중에 발생하는 오류를 처리하도록 특별히 설계되었습니다. 이렇게 하면 거절을 처리하는 깔끔한 방법이 됩니다.
const fetchWithError = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject("Error fetching data."); // Simulating an error
    }, 1000);
  });
};

fetchWithError()
  .then(result => {
    console.log(result);
  })
  .catch(error => {
    console.error(error); // Logs: Error fetching data.
  });
로그인 후 복사
  • .finally()를 사용한 최종 또는 정리 작업: .finally() 메서드를 사용하면 Promise가 이행되었는지 거부되었는지에 관계없이 완료된 후 코드를 실행할 수 있습니다. 이는 성공 및 실패 시나리오 모두에서 실행되어야 하는 정리 작업 또는 작업에 유용합니다.
fetchData()
  .then(result => {
    console.log(result); // Logs: Data fetched successfully!
  })
  .catch(error => {
    console.error(error); // Handle error
  })
  .finally(() => {
    console.log("Promise has settled."); // Logs after either success or failure
  });
로그인 후 복사

간결하게 말하면:

  • then(): Use this method to handle the resolved value of a Promise.
  • catch(): Use this method to handle errors when a Promise is rejected.
  • finally(): This method runs code after the Promise settles, regardless of the outcome, allowing for cleanup or final actions.

4. Promise Chaining

One of the most powerful features of Promises is their ability to be chained together, allowing you to perform multiple asynchronous operations in sequence. This means each operation waits for the previous one to complete before executing, which is particularly useful when tasks depend on each other.

Let's take a look at the following example:

const fetchUserData = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({ userId: 1, username: "JohnDoe" });
    }, 1000);
  });
};

const fetchPosts = (userId) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(["Post 1", "Post 2", "Post 3"]); // Simulated posts
    }, 1000);
  });
};

// Chaining Promises
fetchUserData()
  .then(user => {
    console.log("User fetched:", user);
    return fetchPosts(user.userId); // Pass userId to the next promise
  })
  .then(posts => {
    console.log("Posts fetched:", posts);
  })
  .catch(error => {
    console.error("Error:", error);
  });
로그인 후 복사

In this example, the fetchUserData function returns a Promise that resolves with user information. The resolved value is then passed to the fetchPosts function, which returns another Promise. If any of these Promises are rejected, the error is caught in the final .catch() method, allowing for effective error handling throughout the chain.

Conclusion

In conclusion, Promises are a crucial part of modern JavaScript, enabling developers to handle asynchronous operations in a more structured and efficient way. By using Promises, you can:

  • Simplify the management of asynchronous tasks and avoid callback hell.
  • Chain multiple asynchronous operations to maintain a clear flow of execution.
  • Effectively handle errors with a unified approach.

As you implement Promises in your own projects, you'll find that they not only improve code readability but also enhance the overall user experience by keeping your applications responsive. I hope that this journey through JavaScript's foundational concepts has provided valuable insights for developers. Happy coding!

위 내용은 JavaScript Promise: 알아야 할 기본 사항의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿