创建一个Q promise并稍后调用它

时间:2014-10-20 18:02:45

标签: javascript typescript promise q

我正在尝试在打字稿中创建一个对话框系统。

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

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);
    }
}

1 个答案:

答案 0 :(得分:1)

您要么使用存储为班级私人字段的deferred,要么使用Promise constructor(首选)。

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
    })
}