javascript - nodejs가 비동기 구현을 구현할 때 발생하는 문제
黄舟
黄舟 2017-07-03 11:41:44
0
6
867

예를 들어, 모두 동기화 작업을 수행하는 세 가지 함수 a, b, c가 있습니다. 단순화하기 위해 동기화 작업을 단순화했습니다.

으아아아

a() 실행의 출력은 2입니다
그러나 c 함수가 동기 함수가 아닌 비동기 작업을 실행하는 경우, 예를 들어

으아아아

a()를 실행할 때 2를 올바르게 출력하려면 약속 또는 비동기를 통해 c를 캡슐화해야 합니다.
Similar to

으아아아

c는 비동기 함수가 되기 때문에 b는 c를 호출해야 하고, b도 비동기로 변경해야 하고, 등등, a도 비동기로 변경해야 합니다

으아아아

a().then(함수(데이터) {

으아아아

}) 이런 식으로 2

가 출력될 수 있습니다.

2를 올바르게 출력하기 위해 a와 b를 모두 변경했습니다. a와 b를 변경하지 않고 올바른 출력을 얻을 수 있는 다른 방법이 있는지 궁금합니다.
처음 코드 작성을 시작할 때는 비동기 상황을 고려하지 않았기 때문에 a와 b 같은 함수가 서로 다른 파일에 분산되어 있는데, 이제는 c가 비동기 작업을 수행할 수 있도록 하기 위해서입니다. 바꾸기가 너무 어렵네요. 다른 좋은 방법이 있나요?

다음은 새로 추가된 질문입니다
위 문제는 아래 답변에서 Promise 객체를 직접 반환하면 해결이 가능하지만, 실제 코드 구조는 대략 이렇습니다

으아아아

이 방법을 따르면 a와 b가 Promise 객체를 반환할 수 있도록 a와 b의 반환 메서드를 수정해야 합니다.
이러한 구조에서는 별도의 입력 없이 올바른 출력을 얻을 수 있는 방법이 있는지 모르겠습니다. a와 b의 기능 변경

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답(6)
阿神

안타깝지만 노드가 명시적으로 비동기식이므로 함수를 동기식에서 비동기식으로 변경하면 이에 의존하는 함수도 변경해야 합니다. 리팩토링할 때 정말 골치 아픈 일이지만 그래도 해야 합니다. 참아보자.

async 키워드가 필요하지 않은 fibjs와 같은 리팩토링은 매우 걱정할 필요가 없습니다. c를 변경하면 암시적 비동기를 표시할 필요가 없기 때문에 a와 b를 변경할 필요가 없습니다.

洪涛

저는 아직도 Promise를 잘 이해하지 못합니다. 여기서는 b()a() 변경할 필요가 없습니다.

함수에서 이 Promise를 캡처하려면 c,只需要返回一个promise对象,经过函数b的时候,直接同步返回这个Promise对象,不需要改动函数b使其为异步函数,因为异步操作是在函数c中,b中只进行了同步操作。此时需要在函数a 코드를 다음과 같이 변경할 수 있습니다.

으아악

그럼 이 함수a(),b()가 비동기 작업의 반환 값을 처리하지 않는다면 왜 비동기 함수로 변경해야 할까요?

扔个三星炸死你

http://fibjs.org/docs/manual/...을 시도하여 직접 동기화로 변환할 수 있습니다

滿天的星座

화면을 보고 도안을 많이 만들었다고 해야되나 결국 실패했어요

JS에서 현재 기능을 차단할 방법이 생각나지 않지만 약속의 해결을 제 시간에 실행하는 방법은 다음과 같습니다

으아악

문제는 while(c_result===null && n++<100){}阻塞了函数c_sync, 但是也阻止了.then콜백이 실행되더라도 단일 스레드 비동기 메커니즘으로 인해 특정 콜백이 트리거될 때 스레드가 사용 중이면 콜백이 대기열로 이동할 수 없어 c_result가 아무것도 할 수 없다는 것입니다. 루프 실행 중에 변수 m에 할당되면 루프를 종료할 방법이 없습니다.

그런데 이 질문이 매우 흥미로운 것 같아요. 작성자가 외부 바이너리 라이브러리를 통해 로컬 차단 문제를 해결했습니다.

http://blog.csdn.net/xingqili...

제가 이해한 바는 다음과 같습니다.

js 엔진 자체의 이벤트 루프를 기반으로 하면 특정 블록을 차단할 수 없습니다. 왜냐하면 js 코드의 경우 엔진의 이벤트 루프가 맨 아래에 있기 때문입니다. 그러나 외부 바이너리 모듈의 경우 자체적으로 차단할 수 있습니다. 그리고 js 엔진의 이벤트 루프가 매번 이벤트 큐를 완전히 통과하는지 확인하여 js 엔진의 새 이벤트가 자체 차단 기간 동안 처리될 수 있는지 확인하세요.

巴扎黑

Let a() 출력 약속은 제가 언급한 문제를 실제로 해결할 수 있습니다
그러나 실제로 코드를 수정했을 때 대부분의 코드 구조가 위의 문제와 같지 않았지만
아래에 새로 추가된 구조

를 발견했습니다. 으아악
世界只因有你

정말 죄송하지만, 귀하는 node.js의 이벤트 루프 메커니즘과 이벤트 코어 모듈에 대해 깊이 이해하지 못하고 있습니다.
promise 및 aysnc/await는 실제로 오늘날 비동기 프로세스 제어를 처리하는 주류이지만, 이러한 간단한 문제가 이벤트 메서드로 다시 처리될 수 있다는 의미는 아닙니다.

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿