稍后在TypeScript中解析或拒绝Promise
Resolve or reject Promise later in TypeScript
在Angular2/TypeScript项目中,当显示一个对话框时,系统会返回一个Promise对象给调用者,该对象将在用户关闭对话框后解析。
Promise类接口不公开resolve()或reject()方法,所以我必须保存对这些方法的引用,以便以后调用它们。
这看起来不对。有没有更好的办法?
class Dialog {
private resolve;
private reject;
show(): Promise<any> {
var p = new Promise<any>((resolve, reject) => {
//save method references for later use
this.resolve = resolve;
this.reject = reject;
});
return p;
}
close() {
this.resolve();
}
}
我需要这样的东西,所以我创建了这个未来的类:
class Future<T> implements PromiseLike<T> {
private promise: Promise<T>;
private resolveFunction: (value?: T | PromiseLike<T>) => void;
private rejectFunction: (reason?: any) => void;
constructor(promise?: Promise<T>) {
if (!(this instanceof Future)){
return new Future(promise);
}
this.promise = promise || new Promise(this.promiseExecutor.bind(this));
}
public asPromise(): Promise<T> {
return this.promise;
}
public then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Future<TResult>;
public then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): Future<TResult>;
public then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => any): Future<TResult> {
return new Future(this.promise.then(onfulfilled, onrejected));
}
public catch(onrejected?: (reason: any) => T | PromiseLike<T>): Future<T>;
public catch(onrejected?: (reason: any) => void): Future<T>;
public catch(onrejected?: (reason: any) => any): Future<T> {
return new Future(this.promise.catch(onrejected));
}
public resolve(value?: T | PromiseLike<T>) {
this.resolveFunction(value);
}
public reject(reason?: any) {
this.rejectFunction(reason);
}
private promiseExecutor(resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) {
this.resolveFunction = resolve;
this.rejectFunction = reject;
}
}
像这样使用:
let future = new Future<string>();
// do what not and then:
future.resolve("A_VALUE");
// or reject it:
future.reject("MESSAGE");
你也可以保存未来的实例,返回它,然后解析/拒绝:
class MyClass {
private future: Future<string[]>;
constructor() {
this.future = new Future<string[]>();
}
fetch(url: string): Promise<string[]> {
ISSUE_HTTP_REQUEST(url)
.then(this.future.resolve.bind(this.future))
.catch(this.future.reject.bind(this.future));
return this.future.asPromise();
}
}
相关文章:
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 在promise中为回调添加超时并拒绝
- angular ui bootstrap:当模式关闭时,promise被解析/拒绝
- JavaScript Promise 解析并拒绝函数调用序列
- 带有拒绝调用和抛出错误的Promise构造函数
- Bluebird Promise.any() 提前拒绝
- 节点 js,使用带有 Q promise 的猫鼬不调用拒绝函数
- 在ES6 Promise中允许多次解析/拒绝的原因是什么
- 拒绝promise时停止代码执行
- AngularJS/Karma-测试函数返回已解决或拒绝的promise
- 当你想要所有结果而不管是否被拒绝时,用什么代替Promise.all()
- Dojo.request.post-返回的promise说"拒绝”;,但服务器似乎已经接受了请求
- Bluebird Promise.all-多个承诺完成了成功和拒绝的汇总
- Angular-返回$modal promise并拒绝它
- node.js Q promise不会通过拒绝处理程序传播异常
- 当action使用promise时,indexOf拒绝在值突变中工作
- 的承诺.all - resolve回调会被触发,尽管Promise被拒绝
- 稍后在TypeScript中解析或拒绝Promise
- 在promise .race中第一个promise被解析(拒绝)后执行是否结束
- new Promise和Promise的区别.在bluebird中解决/拒绝