javascript - 稍后在 TypeScript 中解决或拒绝 Promise

标签 javascript angular typescript promise

在 Angular2/TypeScript 项目中,显示对话框时,系统会向调用者返回一个 Promise 对象,该对象将在用户关闭对话框后解析。

Promise 类接口(interface)不公开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();
    }
}

最佳答案

我需要这样的东西,所以我创建了这个 future 的类(class):

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

您还可以保存 future 的实例,返回它,然后稍后解决/拒绝:

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

关于javascript - 稍后在 TypeScript 中解决或拒绝 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40356609/

相关文章:

angular - 如何导入模块或有条件地提供服务? (AOT)

javascript - 如何将一个数组合并到另一个数组的对象值中

javascript - 铁 :Router add events on change router

javascript - Uncaught Error : Not an Array - google charts

angular - 如何从 Angular 中的 Observable 中提取数据

html - Angular 处理条件驱动形式

node.js - 为什么我收到无法确定 GraphQL 输出错误?

javascript - 在 TypeScript 中,如何在外部模块中扩展环境 JQuery 接口(interface)?

javascript - react : Updating form on button click

javascript - javascript/jquery执行顺序问题