2016-03-08 137 views
1

我想在TypeScript中構建一個類似控制器的MVC,並且我很難讓異步方法返回延期承諾。異步TypeScript函數返回jQuery承諾

這是我的函數簽名:

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

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

我原以爲像這樣的東西是異步函數最常見的用例,但我找不到任何例子。

任何幫助?

+0

這是仍然適用於jQuery的3(從我讀過這應該是承諾/ A +標準)? –

+0

我不知道我害怕。在這篇文章後不久,我停止使用jQuery。我發現代替vanilla js/typescript更容易 – AsciiSmoke

回答

1

JQueryPromise不滿足通過異步/ AWAIT,他們應該inplement以下接口作出的承諾的要求:

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節無極這裏:link

3

the issue detailing async functions(我發現沒有更好的參考):

異步函數必須提供返回類型註釋,指向兼容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的deferreds是 - for good reasons - 不是他們的兼容性列表。

1

要啓用jQuery承諾的異步/等待,請使用以下內容。它與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; 
}