Javascript 创建Q承诺并在以后调用它
我正在尝试用typescript创建一个对话框系统 预期用途是调用方执行类似的操作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
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?如果不引入额外的延迟对象,它就不会那么冗长了。此外,如果回调函数(topromise()
,即创建对话框并设置异步侦听器的函数)抛出,它会自动拒绝该承诺。公平地说,如果您将其分配给setResult
,如图所示,您并没有得到很好的保证,延迟也一样好。另一方面,将解析的逻辑放在构造函数中会起作用。resolve
分配给setResult
只是为了表明应该调用justresolve
而不是privatesetResult
方法。
public showDialog() : Q.Promise<DialogResult>{
return new Q.Promise(function(resolve) {
// create dialog
setResult = resolve;
// call it somewhere
})
}