Я использую JavaFX's WebView
для анализа веб-сайта. Сайт содержит кучу ссылок - мне нужно открыть каждый из них отдельно, в определенном порядке и получить одну информацию от каждого из них.Синхронизация последовательности асинхронных вызовов
Для того, чтобы убедиться в том, что WebView
загружен весь сайт, я слушаю changed
случае WebEngine
и ждет newState == Worker.State.SUCCEEDED
. Проблема в том, что этот вызов является асинхронным. Когда я звоню webEngine.load(firstAddress);
, код немедленно возвращается и до того, как эта страница будет загружена, мой код вызовет еще webEngine.load(secondAddress);
и так далее.
Я понимаю, почему так сделано (почему async лучше синхронизации), но я новичок в Java, и я не уверен, что является лучшим решением этой проблемы. Я как-то понимаю многопоточность и прочее, поэтому я уже пробовал семафор (CountDownLatch
класс). Но код висит на await
, и я не уверен, что я делаю неправильно.
Может кто-нибудь, пожалуйста, покажите мне, как это должно быть сделано правильно? Может быть, какой-то универсальный образец, как справляться со сценариями вроде этого?
псевдокод, что я хочу добиться:
WebEngine webEngine = new WebEngine();
webEngine.loadPage("http://www.something.com/list-of-cars");
webEngine.waitForThePageToLoad(); // I need an equivalent of this. In the real code, this is done asynchronously as a callback
// ... some HTML parsing or DOM traversing ...
List<String> allCarsOnTheWebsite = webEngine.getDocument()....getChildNodes()...;
// allCarsOnTheWebsite contains URLs to the pages I want to analyze
for (String url : allCarsOnTheWebsite)
{
webEngine.loadPage(url);
webEngine.waitForThePageToLoad(); // same as in line 3
String someDataImInterestedIn = webEngine.getDocument()....getChildNodes()...Value();
System.out.println(url + " : " + someDataImInterestedIn);
}
System.out.println("Done, all cars have been analyzed");
Да, я думаю, что это лучшее решение для моей проблемы. Я думал, что код будет грязным из-за этой цепочки вызовов, но так, как вы его написали - мне это нравится! Спасибо за ваше время! – PiotrK