У меня есть ситуации, когда я называю внешний API A и использовать свой ответ на корм просьбу API B и назвать его, а затем возвращает ответ вызывающего API А. Что-то вроде нижеКак заблокировать поток, чтобы ждать ответа в vert.x?
method(){
response = call API A
}
method_for_API_A(){
handler() ->{
API_B
}
return response;
}
method_for_API_B(){
//code to call API B
}
Я Я сталкиваюсь здесь, что метод API A возвращает ответ, не дожидаясь получения ответа от B.
Я проверил способ executeBlocking для vert.x, а также попытался использовать «блокирующую очередь», но не смог достичь того, что я намерен делать. Может кто-то, пожалуйста, направить меня, чтобы исправить способ сделать это. Спасибо заранее.
EDIT: Просто чтобы объяснить точный сценарий
Class MyClass{
public Response method_A (Request request){
String respFromApiA = Call_API_A(request) ; // STEP 1
Response respFromApiB = Call_API_B(request, respFromApiA); // STEP 2
Print(respFromApiB) // PRINT FINAL Response
return respFromApiB; // STEP 3
}
String Call_API_A(Request request){
// Implementation
Print(string); // PRINT API A response
return string
}
Response Call_API_B(Response response){
// Implementation
Print(response); // PRINT API B response
return response;
}
}
Я использую vert.x рамки с Java. Теперь, что происходит во время выполнения, поток переходит к шагу 1, инициирует вызов API. Переход к STEP 2 (не дожидаясь 'respFromApiA') и вызывает вызов API B (который не сработает, потому что respFromApiA - NULL). И, наконец, поток переходит к STEP 3 и возвращается отсюда. (не дожидаясь результатов API A и API B). Если мы видим заказ на печать будет что-то вроде этого
PRINT FINAL Response
PRINT API A response
PRINT API B response
То, что я пытаюсь добиться?
Wait for API A response.
Make call to API B. Wait for API B response.
Return response got from API B.
Надеюсь, я смогу сделать ясно, на этот раз. Пожалуйста, дайте мне знать, если вам нужны дополнительные материалы.
Почему вы не делаете обоих вызовов в 'методе' последовательно? – Fildor
Я думаю, вы делаете неблокирующие вызовы. Скорее всего, они возвращают свои ответы в обратном вызове (я не знаю vert.x, извините). Поэтому вам нужно найти либо возможность указать vert.x, что вы хотите, чтобы эти вызовы блокировались и возвращали результат, или вам нужно использовать обратные вызовы. – Fildor
Возможно, если вы указали больше кода (реального кода), то кто-то с опытом работы с vert.x мог бы помочь ... – Fildor