다음과 같이 다시 작성된 제목: 재귀 비동기 함수는 값을 반환할 수 없습니다.
P粉729518806
P粉729518806 2023-08-29 21:11:13
0
2
481
<p>mysql 쿼리를 실행하는 재귀적 비동기 함수를 만들고 있습니다. 제가 사용하고 있는 데이터베이스는 다음과 같습니다. </p> <pre class="brush:php;toolbar:false;">+----+------+--------- ----+------------+------------+---------+ | ID | 완료됨 | +----+------------+------------+----------+- -------- ---+---------+ | 1 | 클린 아파트 | 0 | | 2 | 화장실 청소 1 | | 3 | 주방을 청소하다 1 | | 4 | 샤워하기 2 | | 5 | 화장실을 씻다 2 | | 6 | 유리창 청소 1 | | 7 | 깨끗한 수도꼭지 4 | |8 |싱크대 청소 2022-03-24 00:47:33 | | 9 | 쓰레기 버리기 1 | 2022-03-24 00:47:33 | +----+------------+------------+----------+- -------- --+---------+</pre> <p>이 데이터베이스를 배열에 저장하면 다음 함수를 실행할 수 있습니다. </p> <pre class="brush:php;toolbar:false;">function comp(tasks, taskId) { var task = task.find(task => task.id === taskId) var children = task.filter(t => t.parentId === taskId) task.children = children.map(child => comp(tasks, child.id)); 작업 반환 }</pre> <p> 하위 작업을 기본 작업에 반복적으로 중첩합니다. </p> <p>문제는 제가 비동기 함수를 충분히 이해하지 못한다는 것입니다.</p> <p>지금까지의 진행 상황은 다음과 같습니다.</p> <pre class="brush:php;toolbar:false;">비동기 함수 comp(taskId) { // SELECT * FROM 작업 WHERE id = taskId var task = wait con.promise().query('select * from task where id = ' + taskId) // SELECT * FROM 작업 WHERE parentId = taskId var children = wait con.promise().query('select * from task where parentid = ' + taskId) task[0][0].children = children[0].map(child => { comp(child.id) }) console.log(작업[0]) }</pre> <p>그러나 이렇게 하면 정의되지 않은 하위 작업이 있는 작업이 반환됩니다.</p> <pre class="brush:php;toolbar:false;">[ { 아이디: 1, 작업: '아파트 청소', 완료: 0, 부모 ID: null, 작성자: 1, 생성 날짜: 2022-03-23T23:47:33.000Z, 어린이: [ 정의되지 않음, 정의되지 않음 ] } ]</pre> <p>요컨대 제가 원하는 것은 다음과 같습니다. </p> <pre class="brush:php;toolbar:false;">{ 아이디: 1, 작업: '아파트 청소', 완료: 0, 부모 ID: null, 작성자: 1, 생성 날짜: 2022-03-23T23:47:33.000Z, 어린이들: [ { 아이디: 2, 작업: '화장실 청소', 완료: 0, 부모 ID: 1, 작성자: 1, 생성 날짜: 2022-03-23T23:47:33.000Z, 어린이들: [ { 아이디: 4, 작업: '샤워 세척', 완료: 0, 부모 ID: 2, 작성자: 1, 생성 날짜: 2022-03-23T23:47:33.000Z, 어린이들: [ ... ] }, { 아이디: 5, 작업: '화장실 세척', 완료: 0, 부모 ID: 2, 작성자: 1, 생성 날짜: 2022-03-23T23:47:33.000Z, 어린이들: [ ... ] }, ] }, { 아이디: 3, 작업: '주방 청소', 완료: 0, 부모 ID: 1, 작성자: 1, 생성 날짜: 2022-03-23T23:47:33.000Z, 어린이들: [ ... ] }, }</pre> <p>제안사항이 있으신가요? </p>
P粉729518806
P粉729518806

모든 응답(2)
P粉970736384

다음 재귀 호출을 시작하기 전에 원래 두 가지 예상 항목의 실행이 완료되기를 기다리고 재귀 호출 자체를 기다리지 않고 인쇄합니다.

먼저

가 필요합니다. 으아악

하지만 각 어린이가 달리기를 마칠 때까지 기다려야 합니다.

으아악

는 전달한 배열의 각 Promise가 완료될 때까지 기다리는 반면, children[0].map(async () => {})는 Promise의 배열을 반환합니다. 계속 기다리면 괜찮을 것입니다.

P粉596191963

실제로 코드의 유일한 문제는 비동기 함수comp()的结果。 map()将返回一个Promise数组,你需要等待所有这些Promise,可以使用Promise.all()来实现。 Promise.all()返回一个Promise,当传递给Promise.all()에서 배열의 모든 Promise가 해결되었을 때 Promise가 해결될 때까지 기다리지 않는다는 것입니다. 기다리면 자식 배열이 예상대로 전파됩니다.

Promise.all()를 사용한 코드입니다. 현재 적절한 데이터베이스가 준비되어 있지 않기 때문에 모든 데이터베이스 비동기 호출을 인위적인 지연이 있는 함수에 대한 비동기 호출로 대체하여 호출이 어떻게 기다리고 있는지, 결과가 실제로 기다리고 있는지 여부를 확인할 수 있습니다. 을 위한.

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!