>웹 프론트엔드 >JS 튜토리얼 >루프에서 비동기 데이터 검색을 어떻게 처리하고 응집력 있는 데이터 세트를 반환하기 전에 모든 쿼리가 완료되었는지 확인합니까?

루프에서 비동기 데이터 검색을 어떻게 처리하고 응집력 있는 데이터 세트를 반환하기 전에 모든 쿼리가 완료되었는지 확인합니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-10 15:54:03513검색

How do you handle asynchronous data retrieval in loops and ensure all queries complete before returning a cohesive dataset?

루프에서 비동기 데이터 검색: 효과적인 쿼리 결과 처리

많은 프로그래밍 시나리오에서 여러 비동기 데이터베이스를 수행해야 하는 필요성에 직면합니다. 데이터를 검색하기 위해 루프에서 쿼리합니다. 그러나 결과를 관리하고 이를 하나의 응집력 있는 데이터 세트로 반환하는 것은 어려울 수 있습니다.

문제 설명

질문에 제공된 코드는 다음을 수행하려고 시도합니다. 루프 내의 여러 MongoDB 쿼리. 여기서 목표는 검색된 데이터를 단일 배열에 축적하는 것입니다. 그러나 코드에서는 예상 데이터가 포함되지 않고 결과가 '정의되지 않음'으로 반환되는 문제가 발생합니다. 모든 쿼리가 완료될 때까지 기다리지 않고 'return' 문이 즉시 실행되기 때문입니다.

솔루션 개요

이 문제를 해결하려면 다음이 필요합니다. 비동기 프로그래밍의 원칙을 수용합니다. 이러한 원칙에는 약속을 사용하고 비동기 작업을 적절하게 처리하여 모든 쿼리가 완료된 경우에만 결과가 반환되도록 보장하는 것이 포함됩니다.

Promises 및 비동기 함수

Promise 비동기 작업의 최종 결과를 나타냅니다. 이는 '해결'과 '거부'라는 두 가지 콜백 함수를 포함하는 개체입니다. 작업이 성공적으로 완료되면 결과와 함께 'resolve'가 호출되고, 실패할 경우 'reject'가 호출됩니다.

우리 시나리오에서 각 데이터베이스 쿼리는 promise 개체를 반환해야 합니다. 이를 통해 각 쿼리가 완료된 후 순차적으로 실행되는 콜백 체인을 생성할 수 있습니다.

코드 리팩터링

이러한 원칙을 통합하도록 코드를 리팩터링해 보겠습니다. :

var getPrayerCount = function(data2) {
  var id = data2.id;
  return find({prayerCat:id})
    .then(function(prayer) {
      if (!prayer)
        data2.prayersCount = 0;
      else
        data2.prayersCount = prayer.length;
      return data2;
    });
}

var getPrayerInCat = function(data) {
  var promises = data.map(getPrayerCount);
  return Q.all(promises);
}

'getPrayerCount'에서는 대신 'find'를 사용합니다. 전자의 경우 'Prayer.find'는 약속을 반환합니다. 그런 다음 각 쿼리의 결과를 처리할 '.then' 콜백을 연결합니다.

'getPrayerInCat'에서는 'Q.all'을 사용하여 모든 개별 쿼리의 완료를 나타내는 단일 약속을 생성합니다. . 이렇게 하면 코드가 결과를 반환하기 전에 모든 쿼리가 완료될 때까지 기다릴 수 있습니다.

이러한 원칙을 따르면 루프에서 비동기 데이터 검색을 효과적으로 처리할 수 있으며 쿼리가 모두 실행될 때 결과가 응집력 있는 데이터 세트로 반환되도록 할 수 있습니다. 쿼리가 완료되었습니다.

위 내용은 루프에서 비동기 데이터 검색을 어떻게 처리하고 응집력 있는 데이터 세트를 반환하기 전에 모든 쿼리가 완료되었는지 확인합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.