예를 들어, 모두 동기화 작업을 수행하는 세 가지 함수 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의 기능 변경
阿神2017-07-03 11:43:44
안타깝지만 노드가 명시적으로 비동기식이므로 함수를 동기식에서 비동기식으로 변경하면 이에 의존하는 함수도 변경해야 합니다. 리팩토링할 때 정말 골치 아픈 일이지만 그래도 해야 합니다. 참아보자.
async 키워드가 필요하지 않은 fibjs와 같은 리팩토링은 매우 걱정할 필요가 없습니다. c를 변경하면 암시적 비동기를 표시할 필요가 없기 때문에 a와 b를 변경할 필요가 없습니다.
PHP中文网2017-07-03 11:43:44
저는 아직도 Promise를 잘 이해하지 못합니다. 여기서는 b()
和a()
변경할 필요가 없습니다.
함수에서 이 Promise를 캡처하려면 c
,只需要返回一个promise
对象,经过函数b
的时候,直接同步返回这个Promise对象,不需要改动函数b使其为异步函数,因为异步操作是在函数c
中,b
中只进行了同步操作。此时需要在函数a
코드를 다음과 같이 변경할 수 있습니다.
그럼 이 함수a(),b()
가 비동기 작업의 반환 값을 처리하지 않는다면 왜 비동기 함수로 변경해야 할까요?
滿天的星座2017-07-03 11:43:44
화면을 보고 도안을 많이 만들었다고 해야되나 결국 실패했어요
JS에서 현재 기능을 차단할 방법이 생각나지 않지만 약속의 해결을 제 시간에 실행하는 방법은 다음과 같습니다
으아악문제는 while(c_result===null && n++<100){}
阻塞了函数c_sync, 但是也阻止了.then
콜백이 실행되더라도 단일 스레드 비동기 메커니즘으로 인해 특정 콜백이 트리거될 때 스레드가 사용 중이면 콜백이 대기열로 이동할 수 없어 c_result가 아무것도 할 수 없다는 것입니다. 루프 실행 중에 변수 m에 할당되면 루프를 종료할 방법이 없습니다.
http://blog.csdn.net/xingqili...
제가 이해한 바는 다음과 같습니다.
js 엔진 자체의 이벤트 루프를 기반으로 하면 특정 블록을 차단할 수 없습니다. 왜냐하면 js 코드의 경우 엔진의 이벤트 루프가 맨 아래에 있기 때문입니다. 그러나 외부 바이너리 모듈의 경우 자체적으로 차단할 수 있습니다. 그리고 js 엔진의 이벤트 루프가 매번 이벤트 큐를 완전히 통과하는지 확인하여 js 엔진의 새 이벤트가 자체 차단 기간 동안 처리될 수 있는지 확인하세요.
巴扎黑2017-07-03 11:43:44
Let a() 출력 약속은 제가 언급한 문제를 실제로 해결할 수 있습니다
그러나 실제로 코드를 수정했을 때 대부분의 코드 구조가 위의 문제와 같지 않았지만
아래에 새로 추가된 구조
世界只因有你2017-07-03 11:43:44
정말 죄송하지만, 귀하는 node.js의 이벤트 루프 메커니즘과 이벤트 코어 모듈에 대해 깊이 이해하지 못하고 있습니다.
promise 및 aysnc/await는 실제로 오늘날 비동기 프로세스 제어를 처리하는 주류이지만, 이러한 간단한 문제가 이벤트 메서드로 다시 처리될 수 있다는 의미는 아닙니다.