Сетевые запросы являются асинхронными для предотвращения блокировки пользовательского интерфейса. Fetch API , который Apollo использует под капотом, использует Promises вместо более традиционных обратных вызовов для обработки асинхронных запросов ресурсов по сети, поэтому API-интерфейс Apollo также основан на Promises. Нет доступных методов, которые позволили бы вам синхронно извлекать запрос GraphQL - вам просто нужно правильно структурировать свой код для обработки Promise после его разрешения.
В следующих примерах предполагается, что вы правильно настроили экземпляр клиента. Использование then
:
function doSomething () {
client.query({ query: SOME_QUERY })
.then(({ data }) => {
// Use the returned data however you like
})
.catch(error => {
// Handle error
})
}
Использование async / await:
async function doSomething () {
try {
const { data } = await client.query({ query: SOME_QUERY })
} catch (error) {
// Handle error
}
}
Если вы не знакомы с Promises, было бы полезно ознакомиться с соответствующей документацией [ 114] и ознакомьтесь с некоторыми учебниками .
Я понял это. Комментарии в соответствии с принятым ответом здесь объясняют это: Динамично добавленный JTable, не отображающийся
В основном я просто добавил следующее перед mainPanel.add ()
mainPanel.setLayout(new java.awt.BorderLayout());
Swing/AWT
компоненты обычно должны иметь расположение, прежде чем Вы добавите вещи к ним - иначе UI
не будет знать, куда поместить субкомпоненты.
BFreeman предложил BorderLayout
который является одним из самых легких для использования и позволяет Вам 'склеивать' вещи к вершине, нижней части, покинутой, право или центр родителя.
Существуют другие такой как FlowLayout
который похож на a textarea
- это добавляет компоненты слева направо наверху родителя и переносится на новую строку, когда это добирается в конец.
GridBagLayout
который всегда был известен за то, что был невозможен выяснить, но действительно дает Вам почти весь контроль, Вам было бы нужно. Немного как те HTML
таблицы, которые мы раньше видели с причудливыми комбинациями rowspan, colspan, ширины и атрибутов высоты - который никогда, казалось, не смотрел вполне, как Вы хотели их.
Как со всем кодом колебания, не забывайте называть любое обновление gui в потоке отправки события. Посмотрите это для того, почему необходимо сделать обновления как это
// Do long running calculations and other stuff outside the event dispatch thread
while (! finished )
calculate();
SwingUtilities.invokeLater(new Runnable(){
public void run() {
// update gui here
}
}
Попробовать mainPanel.invalidate()
и затем при необходимости, mainPanel.validate()
. Также могло бы стоить проверить, что Вы делаете, это все в конечном счете диспетчеризирует поток, иначе Ваши результаты будут пятнистыми и (обычно) недетерминированными.