首页 > 解决方案 > 调用两次 AngularJS IPromise.then(...) 可以吗?

问题描述

我有一个基于 AngujarJS 1.7 编写的 TypeScript 服务。它的一种方法使用 Promise 异步读取查找值,并将结果缓存在 JavaScript 对象中。这可以。问题是在第一次调用完成之前对同一个 fetch & cache 方法进行了多次调用,因此有多个不必要的 HTTP 请求。绝对最少的代码如下所示:

lookup(lookupType: LookupType): angular.IPromise<IHttpPromiseCallbackArg<LookupInfo[]>> {
    return this.api.get(lookupType.contextPath, null, null);
}

接着

const thePromise = lookup(lookupType);
thePromise.then((response: IHttpPromiseCallbackArg<LookupInfo[]>) => {
    // ...
    return response.data;
});

我的问题是:第二次调用是否会IPromise.then()返回与第一次调用相同的结果而没有任何副作用?

更准确地说,在这样编写的服务中,loadData()使用相同参数的第二次调用是否会重用第一次调用所做的承诺?或者以另一种方式问,是否可以在 IPromise 上调用 .then(...) 两次?

class LookupService {

    private readonly lookupPromises: Dictionary<IPromise<IHttpPromiseCallbackArg<LookupInfo[]>>> = {};
    private readonly lookupData: Dictionary<LookupInfo[]> = {};

    loadData(lookupType: LookupType, ...callbacks: Function[]): IPromise<LookupInfo[]> {
        if (!this.lookupPromises[lookupType.name]) {
            this.lookupPromises[lookupType.name] = this.lookupApi.lookup(lookupType);
        }
        return this.lookupPromises[lookupType.name].then((response: IHttpPromiseCallbackArg<LookupInfo[]>) => {
            this.lookupData[lookupType.name] = response.data;
            this.executeCallbacks(callbacks);
            return response.data;
        });
    }

}

标签: angularjstypescriptpromise

解决方案


推荐阅读