我有一个文本框,用户可以输入字符并打开一个意见框。 我已经在关键事件上发起了事件。有一个定时器设置,之后会触发异步调用,并且在异步调用成功时会加载建议列表。 问题是,当我开始键入字符时,浏览器的加载符号出现,并且它不会让我在文本框中再输入任何字符,直到异步调用成功返回并显示建议。 关键是如果调用是异步的,为什么浏览器会阻止UI上的事件。
以下是代码。 fire事件调用异步调用并打印结束事件消息。所以异步调用不会阻塞。 public void showSuggestions(final String query){
ArrayList<PCTSuggestion> list;
System.out.println("Show Suggestions");
if (query.length() > 0) {
GWT.log(query);
list = cacher.getCachedvalues(query);
//list = new ArrayList<PCTSuggestion>();
if(list != null) {
if(!isTabOut() || !isBlurred()) {
display.showSuggestions(PCTSuggestBox.this, list, true, isAutoSelectEnabled(), suggestionCallback);
} else {
display.hideSuggestions();
}
} else {
this.fireEvent(new NewSuggestionEvent(query, limit));
System.out.println("End of Fire Event");
}
//display.showSuggestions(PCTSuggestBox.this, null, true, isAutoSelectEnabled(), suggestionCallback);
} else {
display.hideSuggestions();
}
}
答案 0 :(得分:1)
可能有1000个原因发生。 AsyncCallbacks实际上不是那么异步。它只在发送实际HTTP请求时不阻止UI线程。但是构建请求,解析响应和处理回调体就像往常一样在UI线程中发生。可能的罪魁祸首:
我不会在此处写下其他996个理由,因为您可以更轻松地实际测量代码的哪一部分速度很慢。
答案 1 :(得分:1)
避免在文本框等输入的每次按键上进行异步调用。
您在Google搜索的建议中看到的内容不是GWT。
如果我想实现你所建议的建议,我不知道如何在GWT中正确实现它。我必须用javascript编写应用程序。建议为您提供类型的服务将位于单独的隐藏隔离框架/ iframe中。密钥处理程序将与该帧通信。这样,我觉得(不是我说得对),文本框i / o不会与异步通信发生冲突。
也许,您应该考虑使用Google javascript闭包工具http://code.google.com/closure/。
GWT几乎不可能解决另一个GWT应用程序,它可能位于另一个框架上,而不需要使用基于服务器的偶数总线。
您需要一个协调父框架,以便需要相互引用和通信的两个或多个框架必须是该父框架的子框架。
但是,你可以在javascript中实现这种写作。在javacript写作可以让你从GWT的所有系绳和袖口中解放出来。
然后,您可以将该服务包装到JSNI调用中,以便您可以继续使用GWT进行布局。我看到的问题是,如何让您的文本框对JSNI调用的外部Javascript可见?也许,通过给文本框一个ID?但是等一下,GWT不想让你给小部件一个ID。您可以为它分配一个ensure debugID,但是在生产代码中可以使用吗?
您可以在uibinder中使用HTML元素作为文本框。 uibinder允许您为HTML元素分配id。但是,那么你必须通过dom读取输入文本框的值。我从未试过用这种方式混合GWT / javascript,只是我的思想实验。