创建一个Q承诺并稍后调用它

Creating a Q promise and invoking it later

本文关键字:调用 承诺 一个 创建      更新时间:2023-09-26

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

预期的用途是,呼叫者会做这样的事情;

dialogBox.showDialog().then((result: DialogResult) => {
    // Handle the dialog result
});

我的DialogBox类可能会有一些这样的方法;

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.setResult(theResult);

然后,这应该解决/实现showDialog方法创建的承诺。

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

完整性更新;感谢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);
    }
}

您可以使用作为类的私有字段存储的deferred,也可以使用Promise构造函数(首选)。

private deferred : Q.Deferred<DialogResult>; 
public showDialog() : Q.Promise<DialogResult>{
    this.deferred = Q.defer();
    // create dialog
    return this.deferred.promise;
}
public void setResult(result : DialogResult){
    this.deferred.resolve(result);
}

public showDialog() : Q.Promise<DialogResult>{
    return new Q.Promise(function(resolve) {
        // create dialog
        setResult = resolve;
        // call it somewhere
    })
}