我想在TypeScript中構建一個類似控制器的MVC,並且我很難讓異步方法返回延期承諾。異步TypeScript函數返回jQuery承諾
這是我的函數簽名:
static async GetMatches(input: string, loc?: LatLng):JQueryPromise<any> {
編譯器告訴我一個「JQueryPromise」不是一個有效的異步函數的返回類型。
我原以爲像這樣的東西是異步函數最常見的用例,但我找不到任何例子。
任何幫助?
我想在TypeScript中構建一個類似控制器的MVC,並且我很難讓異步方法返回延期承諾。異步TypeScript函數返回jQuery承諾
這是我的函數簽名:
static async GetMatches(input: string, loc?: LatLng):JQueryPromise<any> {
編譯器告訴我一個「JQueryPromise」不是一個有效的異步函數的返回類型。
我原以爲像這樣的東西是異步函數最常見的用例,但我找不到任何例子。
任何幫助?
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
從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 - 不是他們的兼容性列表。
要啓用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;
}
這是仍然適用於jQuery的3(從我讀過這應該是承諾/ A +標準)? –
我不知道我害怕。在這篇文章後不久,我停止使用jQuery。我發現代替vanilla js/typescript更容易 – AsciiSmoke