javascript - 如何在 TypeScript 中用 Promise 包装返回类型?

标签 javascript angularjs typescript

我正在使用 TypeScript 编写 Angular 1.x,并且我有一个负责加载数据的服务 (DataService)。举个简单的例子,它查询一个节点并返回一个节点。在界面中:

getNode(id: number): ng.IPromise<Node>;

以及实现:

  getNode(id: number) {
            return this.ajaxService.getNode(id)
                .then((result: ng.IHttpPromiseCallbackArg<Node>) => {
                    return new Node(result.data.ID, result.data.Name);
                });
        }

但是,我想引入另一项服务来存储这些结果并返回它们(如果我之前已经查询过它们)。所以类似:

getNode(id: number) {
        var loadedNode = this.storageService.nodes.filter(e => (e.ID == id));
        if (loadedNode.length > 0) {
            return loadedNode[0];
        }

        return this.ajaxService.getNode(id)
            .then((result: ng.IHttpPromiseCallbackArg<Node>) => {
                var n = new Node(result.data.ID, result.data.Name);
                this.storageService.nodes.push(n);
                return n;
            });
    }

但是,返回类型失败,因为它需要“ng.IPromise”而不仅仅是“Node”。我怎样才能包装'returnloadedNode[0];'进入某种 promise 返回类型而不是返回实际对象?

最佳答案

你可以这样做,使用 $q-service :

getNode(id: number) {
    var deferred = this.$q.defer();

    var loadedNode = this.storageService.nodes.filter(e => (e.ID == id));
    if (loadedNode.length > 0) {
        // immediately resolve with the cached node
        deferred.resolve(loadedNode[0]);
    } else {
        // else load through service
        this.ajaxService.getNode(id)
            .then((result: ng.IHttpPromiseCallbackArg<Node>) => {
                var n = new Node(result.data.ID, result.data.Name);
                this.storageService.nodes.push(n);

                // resolve with the loaded node
                deferred.resolve(n);
            });
    }

    // return the promise to register callbacks
    return deferred.promise;
}

用法:

myService.getNode(id).then((node) => {
    // success
}, () => {
    // error
});

关于javascript - 如何在 TypeScript 中用 Promise 包装返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38831417/

相关文章:

dom - AngularJS:当用户操作同时影响模型和 DOM 时

angularjs - 如何使用 Go 从一个 HTTP 请求中解析文件和 JSON 数据?

javascript - 使用 typescript ENUM 动态传递 props

angularjs - Protractor 测试在 XAMPP 的根文件夹中打开浏览器

javascript - 如何快速修复 VS 代码中的所有内容( typescript )

javascript - 我应该如何声明返回没有数据的 $q promise 的函数的返回类型?

javascript - 如何在 JavaScript 中添加类列表并仅显示最后一个类?

Javascript 递归(树结构)

javascript - jquery - 禁用具有动态名称的按钮和输入

javascript - 原型(prototype) - 在 HTMLInputElement 之后获取下一个文本输入