簡體   English   中英

如何在TypeScript中包裝帶有承諾的返回類型?

[英]How do I wrap a return type with a promise in 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”。 如何包裝“ return loadNode [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
});

使用$ q.when(值,[successCallback],[errorCallback],[progressCallback])

您可以使用

return $q.when(loadedNode[0]);

更多信息, 角度$ q

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM