这个问题与打字稿并不完全相关,但如果没有上下文,就不清楚为什么我什至需要这种行为。应该相对直接地了解您是否了解 Typescript。
我在 Typescript 中有一个对话框类实现,看起来像这样(仅显示相关的方法和字段):
class BaseDialog{
...
public dialogEl: JQuery;
public AjaxLoadContent(route: string) {
if (this.dialogEl !== undefined)
this.dialogEl.load(route);
return this;
}
public HtmlLoadContent(html: string) {
if (this.dialogEl !== undefined)
this.dialogEl.empty().html(html);
return this;
}
public Show() {
if (this.dialogEl !== undefined)
this.dialogEl.dialog("open");
}
...
}
我正在返回this
,以便可以按如下方式链接对 Show() 的调用AjaxLoadContent()
:HtmlLoadContent()
var dialog = new BaseDialog();
dialog.AjaxLoadContent("/Account/Login").Show(); //Ajax call
dialog.HtmlLoadContent(someHtml).Show(); //Load from variable, no ajax call
我发现这种链接语法非常干净且合乎逻辑,因此我想坚持使用它,但是,在 ajax 场景中,Show()
在 ajax 完成之前被调用,load()
因此对话框打开,然后在内容出现之前会有延迟。我无法提供回调,load()
因为我想显式链接Show()
到调用而不是在内部调用它......因此,我需要某种同步机制。
我现在正在研究 Frame.js 来完成这种“同步”风格,而不用像$.ajaxSetup({async: false;})
. 这是我希望能起作用的答案:https ://stackoverflow.com/a/10365952
但是,以下代码仍然存在延迟:
public AjaxLoadContent(route: string) {
if (this.dialogEl !== undefined){
var that = this;
Frame(function (next) {
$.get(route, next);
});
Frame(function (next, response) {
that.dialogEl.html(response); //Breakpoint 1
});
Frame.init();
return this; //Breakpoint 2
}
}
然而,这似乎不起作用,因为尽管我已经定义了明确的控制流,但断点 2 首先被击中。Show()
调用之后立即发生(因此return this
加载一个空白对话框),然后最终that.jQueryDialog.html(response)
从第二个 Frame 调用,在对话框已经显示后加载内容(因此仍然存在延迟)。
我怎样才能完成这种同步行为?