2016-03-08 135 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; 
}