Maison > Article > interface Web > Le dilemme Promise.all() : quand ça aide et quand ça fait mal
최신 JavaScript 개발에서는 비동기 작업을 처리하는 것이 일반적인 작업입니다. API 요청, 데이터베이스 쿼리, 파일 읽기 등 비동기 코드 작업은 거의 피할 수 없습니다. 개발자가 접하게 되는 일반적인 도구 중 하나는 Promise.all()입니다. 그러나 저를 포함한 많은 사람들은 Promise.all()이 우리의 특정 사용 사례에 가장 적합한 솔루션인지 제대로 이해하지 못한 채 Promise.all()을 사용하려고 시도하는 함정에 빠질 수 있습니다.
개발자로서 새로운 기능이나 도구를 접하고 이러한 기능이나 도구가 모든 곳에서 구현되어야 한다고 가정하기 쉽습니다. 저는 Promise.all()을 사용하여 이러한 상황에 처해 있었습니다. 여러 Promise를 병렬로 실행하고 계속하기 전에 모든 Promise가 완료될 때까지 기다리는 방법에 대해 읽은 후 이를 내 코드에 통합하고 싶었습니다. 꼭 필요한지 충분히 이해하지 못한 채 시류에 편승하여 가능한 모든 곳에 적용했습니다.
강력한 도구이기 때문에 단순한 대안보다 더 낫다고 가정하기 쉽습니다. 하지만 문맥을 고려하지 않고 맹목적으로 Promise.all()을 적용하는 것이 항상 가장 효율적이거나 읽기 쉬운 코드로 이어지는 것은 아니라는 것을 곧 깨닫게 되었습니다.
Promise.all()이 언제 유용한지 자세히 알아보기 전에 먼저 JavaScript에서 비동기 함수가 작동하는 방식을 살펴보겠습니다. 비동기 함수를 작성하고 wait를 사용하면 JavaScript를 사용하면 나머지 코드를 차단하지 않고도 해당 작업이 수행될 수 있습니다. 이는 하나의 작업을 시작하고 결과를 기다리는 동안 다른 작업으로 넘어갈 수 있음을 의미합니다.
그러나 조심하지 않으면 작업이 독립적으로 실행될 수 있는데도 작업이 불필요하게 서로 종속되게 될 수 있습니다. Promise.all()을 사용하여 이러한 상황에 처하게 되었는데, 모든 비동기 기능을 병렬로 실행하는 것이 항상 좋은 아이디어라고 생각했습니다.
예: 비동기 함수의 순차적 실행
const fetchData = async () => { const data1 = await getChart(); // Request #1 const data2 = await getDetails(); // Request #2 };
data1과 data2가 코드에서 차례로 가져오더라도 브라우저는 여전히 두 요청을 모두 비동기식으로 거의 동시에 시작합니다. 실제로 네트워크 탭을 확인했을 때 두 요청이 거의 동시에 시작되는 것을 확인했습니다. 이를 통해 JavaScript가 이미 작업을 병렬로 처리하고 있으며 Promise.all()이 반드시 필요한 것은 아니라는 사실을 깨달았습니다.
처음에는 어디에서나 Promise.all()을 사용하려고 성급하게 사용했음에도 불구하고 이것이 정말 빛을 발하는 상황이 있습니다. 앞으로 진행하기 전에 여러 비동기 작업이 완료될 때까지 기다려야 할 때 특히 유용합니다.
Promise.all()을 사용하는 이유는 무엇입니까?
예: Promise.all() 사용
const fetchData = async () => { const [data1, data2] = await Promise.all([getChart(), getDetails()]); console.log('Both requests completed'); // This runs only when both requests finish };
이 예에서 getChart()와 getDetails()는 모두 병렬로 실행되며, 함수는 두 가지가 모두 완료될 때까지 기다렸다가 앞으로 나아갑니다. Promise.all()은 두 요청이 서로 연관되어 있고 함께 완료되어야 하는 이와 같은 상황에 적합합니다.
Promise.all()을 몇 번 적용한 후, 이것이 항상 내 코드를 더 좋게 만드는 것은 아니라는 사실을 깨닫기 시작했습니다. 사실 저는 일을 너무 복잡하게 만들고 있었습니다. 두 개의 독립적인 API 요청(getChart() 및 getDetails())이 있었는데 각각 자체 로딩 스피너와 결과가 있었지만 불필요하게 묶었습니다.
Promise.all()을 사용하여 요청이 독립적이고 서로 의존하지 않는 경우에도 결과를 처리하기 전에 두 요청이 모두 완료될 때까지 기다리도록 코드를 강제했습니다. 이와 같은 경우 Promise.all()은 실질적인 이점 없이 복잡성만 추가합니다.
Sometimes, Promise.all() is overkill. If your async functions are independent, meaning one doesn’t rely on the other to complete, then there’s no need to bundle them together. They can run in parallel just fine without waiting on each other, and you can handle their results independently. This realization hit me when I saw that JavaScript already handles asynchronous tasks efficiently without needing to group everything together.
When to Avoid Promise.all()
Example: Independent Requests Without Promise.all()
useEffect(() => { getChart(); // Trigger first async request getDetails(); // Trigger second async request }, []);
In this setup, both requests run in parallel without needing Promise.all(). You can show individual loading states and handle each result independently, which is exactly what I needed for my project.
Let’s look at how these concepts apply to real-world scenarios.
Scenario 1: Fetching Related Data (Use Promise.all())
Imagine you’re building a dashboard where you need to show user information and user purchase history together. In this case, you’d want to wait for both pieces of information to load before rendering the UI. Here, Promise.all() is the right choice:
const fetchData = async () => { const [userInfo, purchaseHistory] = await Promise.all([ fetchUserInfo(), fetchUserPurchaseHistory() ]); console.log('Both user info and purchase history loaded'); };
Scenario 2: Independent API Calls (Avoid Promise.all())
Now, let’s say you’re fetching chart data and table data for a dashboard, and these two pieces of information are independent of each other. You might want to show a spinner for the chart and a separate one for the table. In this case, there’s no need to wait for both requests to complete together:
useEffect(() => { getChart(); // Fire chart request getDetails(); // Fire table request }, []);
Both requests are independent, and you handle each of them separately, updating the UI as soon as each one completes. Promise.all() isn’t necessary here.
Promise.all() is a powerful tool, but it’s not always the best solution. I jumped on the bandwagon initially, assuming that using it everywhere would make my code better. However, I quickly learned that in cases where async functions are independent and have their own loading states, Promise.all() can actually make things more complicated.
Key Takeaways:
Ultimately, it’s important to understand when and why to use a feature like Promise.all() instead of just assuming it’s always beneficial. After stepping back and re-evaluating my use case, I found that sticking with independent async calls was the right approach.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!