簡體   English   中英

異步TypeScript函數返回jQuery Promise

[英]Async TypeScript function return jQuery promise

我正在嘗試在TypeScript中構建類似於MVC的控制器,並且很難讓我的異步方法返回延遲的諾言。

這是我的功能簽名:

static async GetMatches(input: string, loc?: LatLng):JQueryPromise<any> {

編譯器告訴我'JQueryPromise'不是有效的異步函數返回類型。

我以為這樣的東西將是異步函數的最常見用例,但我找不到任何示例。

有什么幫助嗎?

詳細介紹async功能的問題開始 (我找不到更好的參考):

異步函數必須提供返回類型注釋,該注釋指向兼容的Promise類型。 僅當存在全局定義的兼容Promise類型時,才可以使用返回類型推斷。

接着

異步功能需要兼容的Promise抽象才能正常運行。 兼容的實現實現以下接口,這些接口將添加到核心庫聲明(lib.d.ts):

 interface IPromiseConstructor<T> { new (init: (resolve: (value: T | IPromise<T>) => void, reject: (reason: any) => void) => void): IPromise<T>; } interface IPromise<T> { then<TResult>(onfulfilled: (value: T) => TResult | IPromise<TResult>, onrejected: (reason: any) => TResult | IPromise<TResult>): IPromise<TResult>; } 

出於充分原因, jQuery推遲-不在兼容性列表中。

JQueryPromise不滿足async / await的諾言要求,它們應補充以下接口:

interface IPromiseConstructor<T> {  
    new (init: (resolve: (value: T | IPromise<T>) => void, reject: (reason: any) => void) => void): IPromise<T>;  
}  

interface IPromise<T> {  
    then<TResult>(onfulfilled: (value: T) => TResult | IPromise<TResult>, onrejected: (reason: any) => TResult | IPromise<TResult>): IPromise<TResult>;  
}

有關更多詳細信息,請參見此處的第4部分: 鏈接

要為jQuery Prom啟用異步/等待,請使用以下命令。 它與DefinitelyTyped中的jquery.d.ts結合使用。

class JQueryPromise<T> {
    constructor(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) {
        let dfd = $.Deferred<T>();
        function fulfilled(value?: T | PromiseLike<T>) {
            let promise = <PromiseLike<T>>value;
            if (value && promise.then) {
                promise.then(fulfilled, rejected);
            }
            else {
                dfd.resolve(<T>value);
            }
        }
        function rejected(reason) {
            let promise = <PromiseLike<T>>reason;
            if (reason && promise.then) {
                promise.then(fulfilled, rejected);
            }
            else {
                dfd.reject(<T>reason);
            }
        }
        executor(fulfilled, rejected);
        return dfd.promise();
    }
}

例:

interface IData {
  value: number;
}

async function getValue(): JQueryPromise<number> {
    let result = <IData> await $.getJSON('/data.json');
    return result.value;
}

暫無
暫無

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

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