【问题标题】:Resolve or reject Promise later in TypeScript稍后在 TypeScript 中解决或拒绝 Promise
【发布时间】:2017-03-14 09:18:34
【问题描述】:

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

【问题讨论】:

    标签: javascript angular typescript promise


    【解决方案1】:

    我需要这样的东西,所以我创建了这个未来的课程:

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

    【讨论】:

    • 伙计,这太棒了!干得好!
    猜你喜欢
    • 2020-09-08
    • 2023-03-17
    • 1970-01-01
    • 2020-09-17
    • 2020-09-12
    • 2019-04-17
    • 2020-12-22
    • 2018-10-08
    相关资源
    最近更新 更多