Async TypeScript函数返回jQuery承诺

时间:2016-03-08 17:08:42

标签: javascript typescript async-await jquery-deferred

我试图在TypeScript中构建类似MVC的控制器,而我很难让我的异步方法返回延迟的承诺。

这是我的功能签名:

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

编译器告诉我一个&#39; JQueryPromise&#39;不是有效的异步函数返回类型。

我原以为像这样的东西是异步函数最常见的用例,但我找不到任何例子。

任何帮助?

3 个答案:

答案 0 :(得分:3)

来自the issue detailing async functions(我找不到更好的参考资料):

  

异步函数必须提供指向兼容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延迟是 - for good reasons - 不在其兼容性列表中。

答案 1 :(得分:1)

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节“在此承诺:link

答案 2 :(得分:1)

要为jQuery promises启用async / await,请使用以下命令。它与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;
}