먼저 Grails 2.5.4에서는 문제가 없었습니다.Grails 3.2.4에서 .async.task 호출을 가진 컨트롤러는 request.asyncStarted()를 true로 설정하지만 응답을 렌더링하지 않습니다.
Grails 컨트롤러에 각도로 AJAX 호출을하고 Grails 컨트롤러가 응답하지 않습니다. 프론트 엔드 호출은 다음과 같이 보입니다 ..
$http({
method: "GET",
url: actionLink,
params: {}
}).then(function successCallback(response) {
console.log("Yaaay, I got back with some sort of response");
}, function errorCallback(response) {
console.log("ERROR PULLING DETAIL")
});
나는 즉시 반환 .async.task의 AJAX는 어떤 종류를 호출하지 않는 다른 컨트롤러 호출 있음을 확인하고, 잘했습니다. 이 엔드 포인트는하지만, 두 async.task의의를 가지고 있는데 첫 번째 async.task이 정의 된 후 asyncStarted 플래그가 트리거되는 알 수 있습니다 :
첫 번째 request.isAsyncStarted ( log.info("ASYNC CHECK-1 - asyncSupported=" + request.asyncSupported + ", asyncStarted=" + request.isAsyncStarted())
def availabilityTask = Item.async.task {
JSON availability = itemService.getItemAvailabilityAsJSON(itemInstance)
availability
}
log.info("ASYNC CHECK-2 - asyncSupported=" + request.asyncSupported + ", asyncStarted=" + request.isAsyncStarted())
)가 false를 반환하고, 두 번째는 true를 반환 .
2017년 2월 8일 18시 47분 54초 디버그 ogweb.servlet.mvc : I가 로깅 모든 방법을 설정하고 내 로그에이 메시지를 발견 할 때 나는이 비동기 문제가되는에 밀고했다 .GrailsDispatcherServlet : 동시 처리를 위해 응답을 남겨둔다.
이전에는 Grails 2.5.4에서 availabilityTask.get()을 호출하고 지정된 모델과 레이아웃으로 뷰를 렌더링하기 만하면되었다. 이제, 내가 다시 프론트 엔드 플러시 응답을 얻기 위해이 작업을 수행해야한다는 나타납니다 :
if (request.isAsyncStarted()) {
final AsyncContext ac = request.asyncContext;
log.info("Calling to complete async request")
ac.dispatch()
}
이 성가신 것, 내가 모델에 어떤 약속이나 callables을 통과 아니에요 이후 및 이미 작업이 완료되었는지 확인하고 있습니다. 내가이 일을하도록 강요하는 무언가를 놓쳤는가, 또는 비동기 요청을 플러시하기 위해 .dispatch()를 호출해야하는 Async에 관한 Grails의 모든 문서를 어디서나 호출하지 않을 것으로 예상되거나 잘 알려지지 않은 동작이다.
'결과 변압기 모델의 약속을 감지 할 것이지만, 자동 발송 didn를 생각 def availabilityTask = Item.async.task {
JSON availability = itemService.getItemAvailabilityAsJSON(itemInstance)
availability
}
render view : "myView", model:[nonAsyncItems, availabilityTask]
:
UPDATE 이월 2017
10 내가 좋아하는 모델에 약속을 전달하는 시도 나는 Grails Async 문서 b에서 본 것을 모방하려고 생각했다. ut 자동 디스패치가 발생하기 위해서는 전체 모델이 PromiseMap이어야한다고 생각하십니까? 문서에서
제 (나는 동기 및 비동기 데이터를 당기는 컨트롤러가있을 때 적합하지 않은) : 어쨌든
import static grails.async.Promises.*
def index() {
render view:"myView", model: tasks(one:{ 2 * 2 },
two:{ 3 * 3 })
}
을, 내 옵션은 모든 * .async와 컨트롤러를 래핑하는 것입니다 지금은 보인다. 작업을 더 큰 작업 {}으로 폐쇄하거나 디스패치를 수동으로 관리하십시오.
안녕 Graeme, 응답 해 주셔서 감사합니다. 이전에 "작업에 시간이 걸리는 경우"라고 언급하면, .get 또는 Promises.waitAll을 호출하여 내 작업이 완료되었는지 확인하는 것이 내 책임임을 느꼈습니다. 처음 비동기 작업을 사용하기 시작했을 때, 내가 그 일을해야한다는 것을 깨닫지 못하고 비동기 null 오류가 발생하는 문제가 발생했습니다. 나는 내 질문을 편집하여 어떻게 모델에 Promise를 전달하려고 시도했는지 보여주기위한 업데이트를했고, 그 방법으로 자동 디스패치를 감지하지 못했습니다. 모든 것을 작업으로 감쌀 수있는 유일한 방법입니다 {}? –
적어도이 문제를 일으키는 실제 문제/혼란이었던 문서보다 행동/기대 사항을 분명히 밝히기 때문에 이것을 답으로 표시하겠습니다. –