Это одно из мест, с помощью которого привязка данных, используемая во многих новых фреймворках JavaScript, будет очень полезна для вас ...
Итак, если вы используете Angular, React или любые другие фреймворки, которые делают два способа связывания данных, эта проблема просто исправлена для вас, поэтому простым языком ваш результат undefined
на первом этапе, поэтому вы получили result = undefined
до получения данных, а затем, как только вы получите результат , он будет обновляться и присваиваться новому значению, которое отвечает на ваш вызов Ajax ...
Но как вы можете сделать это в чистом javascript или jQuery, например, как вы задали этот вопрос?
Вы можете использовать обратный вызов, обещание и недавно наблюдаемое, чтобы обрабатывать его для вас, например, в обещаниях мы имеем некоторые функции, такие как success () или then (), которые будут выполняться, когда ваши данные будут готовы для вас, с функцией обратного вызова или подписки на наблюдаемые.
Например, в вашем случае, в котором вы используете jQuery, вы можете сделать что-то вроде этого:
$(document).ready(function(){
function foo() {
$.ajax({url: "api/data", success: function(data){
fooDone(data); //after we have data, we pass it to fooDone
}});
};
function fooDone(data) {
console.log(data); //fooDone has the data and console.log it
};
foo(); //call happens here
});
Для получения дополнительной информации n изучение обещаний и наблюдаемых, которые являются новыми способами для создания асинхронных материалов.
Существует проблема с открытым доступом о наличии общего доступа, например GWT.isProdMode()
.
В то же время, если вы действительно должны знать, есть свойство отложенного связывания с именем superdevmode
, которое вы можете использовать в своих правилах <replace-with>
или <generate-with>
.
Как уже упоминалось, есть свойство superdevmode
, которое вы можете использовать.
Вот пример реальной жизни:
public class SuperDevModeIndicator {
public boolean isSuperDevMode() {
return false;
}
}
public class SuperDevModeIndicatorTrue extends SuperDevModeIndicator {
@Override
public boolean isSuperDevMode() {
return true;
}
}
superdevmode
- используйте отложенную привязку - поместите это в свой *.gwt.xml
: <!-- deferred binding for Super Dev Mode indicator -->
<replace-with class="com.adam.project.client.SuperDevModeIndicatorTrue">
<when-type-is class="com.adam.project.client.SuperDevModeIndicator"/>
<when-property-is name="superdevmode" value="on" />
</replace-with>
SuperDevModeIndicator
по отложенному привязке: SuperDevModeIndicator superDevModeIndicator = GWT.create(SuperDevModeIndicator.class);
superDevModeIndicator.isSuperDevMode();
Voila!
Здесь вы найдете документацию по Отложенное связывание .
Возможно, существует «официальный» способ, но это должно работать:
Storage stockStore = Storage.getSessionStorageIfSupported();
if (stockStore != null)
{
boolean isSuperDevMode = stockStore.getItem("__gwtDevModeHook:" + GWT.getModuleName()) != null);
}
Я использовал следующий метод:
private static native boolean isSuperDevMode()/*-{
return typeof $wnd.__gwt_sdm !== 'undefined';
}-*/;
Работает в GWT 2.7.0.
Могу ли я предложить:
public boolean isSuperDevMode()
{
return Window.Location.getPort().equals("8888");
}
Мое решение:
GWT.getModuleBaseForStaticFiles().contains("9876")
Вы можете использовать метод GWTHelper.isSuperDevMode (), реализованный ниже.
public final class GWTHelper {
public static boolean isSuperDevMode() {
final Storage storage = Storage.getSessionStorageIfSupported();
if (storage == null) {
return false;
}
final String devModeKey = "__gwtDevModeHook:" + GWT.getModuleName();
return storage.getItem(devModeKey) != null;
}
}
Чтобы проверить сервер dev-приложения: GWT.getHostPageBaseURL () возвращает http://127.0.0.1:8888/
Серверная сторона: request.getRemoteHost () должен возвращать (хотя я не тестировал это).
Чтобы проверить режим Super Dev (vs dev app server без SDM): Если GWT.getModuleBaseURL () & amp; GWT.getModuleBaseForStaticFiles () отличаются, вы находитесь в режиме Super Dev.
имя свойства = "superdevmode" решение не сработало для меня.