Javascript 创建Q承诺并在以后调用它

Javascript 创建Q承诺并在以后调用它,javascript,typescript,promise,q,Javascript,Typescript,Promise,Q,我正在尝试用typescript创建一个对话框系统 预期用途是调用方执行类似的操作 dialogBox.showDialog().then((result: DialogResult) => { // Handle the dialog result }); private promise : Q.Promise<DialogResult>; public showDialog() : Q.Promise<DialogResult>{ this

我正在尝试用typescript创建一个对话框系统

预期用途是调用方执行类似的操作

dialogBox.showDialog().then((result: DialogResult) => {
    // Handle the dialog result
});
private promise : Q.Promise<DialogResult>; 

public showDialog() : Q.Promise<DialogResult>{
    this.promise = ... // How to create this promise?

    return this.promise;
}

public void setResult(result : DialogResult){
    // What to do here?
}
我的
DialogBox
类可能会有一些这样的方法

dialogBox.showDialog().then((result: DialogResult) => {
    // Handle the dialog result
});
private promise : Q.Promise<DialogResult>; 

public showDialog() : Q.Promise<DialogResult>{
    this.promise = ... // How to create this promise?

    return this.promise;
}

public void setResult(result : DialogResult){
    // What to do here?
}
然后,这应该解决/实现由
showDialog
方法创建的承诺

但我真的不知道Q是否可以实现这一点,因此,如何实现
showDialog
setResult
的(承诺相关部分)。有人有什么想法吗

完整性更新;感谢Bergi,这是我最后的工作代码。最后使用了一个延迟的

export class DialogBox implements INotification {
    private deferred: Q.Deferred<DialogResult>; 

    constructor(public message: string,
                public header: string,
                public buttons?: DialogResult[]) {
    }

    public showDialog(): Q.Promise<DialogResult> {
        this.deferred = Q.defer<DialogResult>();

        // My logic for displaying the box goes here

        return this.deferred.promise;
    }

    public setResult(result: DialogResult) {
        this.deferred.resolve(result);
    }
}
导出类对话框实现INotification{
私人递延:Q.递延;
构造函数(公共消息:string,
公共头:字符串,
公共按钮?:对话框结果[]){
}
公共showDialog():Q.承诺{
this.deferred=Q.deferred();
//我显示该框的逻辑如下所示
归还这个承诺;
}
公共setResult(结果:DialogResult){
此。延迟。解决(结果);
}
}
您可以使用存储为类的私有字段的,也可以使用(这是首选)

私有延迟:Q.延迟;
公共showDialog():Q.承诺{
this.deferred=Q.deferred();
//创建对话框
归还这个承诺;
}
public void setResult(结果:DialogResult){
此。延迟。解决(结果);
}

publicshowDialog():Q.承诺{
返回新的Q.Promise(函数(解析){
//创建对话框
setResult=解析;
//随便找个地方吧
})
}

查看ngDialog的源代码。它实现了一个基于承诺的对话。谢谢为什么首选promise-ctor?如果不引入额外的延迟对象,它就不会那么冗长了。此外,如果回调函数(to
promise()
,即创建对话框并设置异步侦听器的函数)抛出,它会自动拒绝该承诺。公平地说,如果您将其分配给
setResult
,如图所示,您并没有得到很好的保证,延迟也一样好。另一方面,将解析的逻辑放在构造函数中会起作用。
resolve
分配给
setResult
只是为了表明应该调用just
resolve
而不是private
setResult
方法。
public showDialog() : Q.Promise<DialogResult>{
    return new Q.Promise(function(resolve) {
        // create dialog

        setResult = resolve;
        // call it somewhere
    })
}