如何使用 TypeScript 在 Dojo 中调用 xhr
How to call xhr in Dojo using TypeScript
我正在使用 Typescript(新手)和 Dojo,我需要进行异步调用。当您不使用 TypeScript 时,这非常容易。但是,编译器让事情变得更难了,尤其是因为我不允许 "implicit any"。我也喜欢 lambda 风格的回调,但编译器也抱怨那里的 "implicit any"。大多数情况下,我对 Deferred 和 Promise 以及如何导入 promise 模块感到困惑。
有 Typescript/Dojo 经验的人可以告诉我我是否做对了吗?还有,有什么办法可以改善吗?
import xhr = require("dojo/request/xhr");
private getDataAsync(url:string, param:any):dojo.promise.Promise {
var deferred = new Deferred();
var options: any = {
handleAs: 'json',
query: {
'param': param
}
};
xhr.get(url, options).then(
lang.hitch(this, function(data:any) {
var returnValue = this.doSomething(data);
deferred.resolve(returnValue);
}),
function(err:any) {
deferred.reject(err, true);
}
);
return deferred.promise;
}
而且,我这里还需要用到Dojo的xhr吗?是否有内置于 TypeScript 中的东西以浏览器中立的方式包装 XMLHTTPRequest,就像 dojo 那样?
Is there something built into TypeScript that wraps XMLHTTPRequest in a browser-neutral way
没有。 TypeScript 具有 非常 最小的运行时环境,仅用于帮助编译器生成有效代码(几乎只有 __extends 函数)。
I also like the lambda-style callbacks, but the compiler complained about the "implicit any" there, too
这很自然。编译器不知道 XHR 的结果,如果你知道它使用一些接口指定它,或者你可以告诉编译器你不想要类型安全并使用 any
正如你已经在做的那样。
更新 1
I'm still stuck on the differences between dojo.promise.Promise, deferred.promise, and Deferred
承诺就是承诺:https://github.com/promises-aplus/promises-spec
Deferred 具有 promise
(.promise
) 以及漂亮的句柄(.resolve
和 .reject
)来确定所述 promise
.
我认为问题是 dojo.d.ts
中的 Deferred
和 Promise
类 似乎早就应该更新了。它们没有结果类型的通用类型参数,并且 then
回调只是 Function
,因此它们不捕获任何有关函数形状的信息。这没有利用 TypeScript 1.0,更不用说 1.4。
与es6-promise.d.ts
比较,其中Promise<R>
有一个方法then<U>
,其中R
是promise出来的值,U
是then
的解析处理程序产生的值,因此下一个承诺将是 Promise<U>
。所以 promise 的操作链是强类型的,一切都很好。
如果您对 dojo.d.ts
进行类似的改进并向他们设置拉取请求,他们可能会非常感激! :)
我正在使用 Typescript(新手)和 Dojo,我需要进行异步调用。当您不使用 TypeScript 时,这非常容易。但是,编译器让事情变得更难了,尤其是因为我不允许 "implicit any"。我也喜欢 lambda 风格的回调,但编译器也抱怨那里的 "implicit any"。大多数情况下,我对 Deferred 和 Promise 以及如何导入 promise 模块感到困惑。
有 Typescript/Dojo 经验的人可以告诉我我是否做对了吗?还有,有什么办法可以改善吗?
import xhr = require("dojo/request/xhr");
private getDataAsync(url:string, param:any):dojo.promise.Promise {
var deferred = new Deferred();
var options: any = {
handleAs: 'json',
query: {
'param': param
}
};
xhr.get(url, options).then(
lang.hitch(this, function(data:any) {
var returnValue = this.doSomething(data);
deferred.resolve(returnValue);
}),
function(err:any) {
deferred.reject(err, true);
}
);
return deferred.promise;
}
而且,我这里还需要用到Dojo的xhr吗?是否有内置于 TypeScript 中的东西以浏览器中立的方式包装 XMLHTTPRequest,就像 dojo 那样?
Is there something built into TypeScript that wraps XMLHTTPRequest in a browser-neutral way
没有。 TypeScript 具有 非常 最小的运行时环境,仅用于帮助编译器生成有效代码(几乎只有 __extends 函数)。
I also like the lambda-style callbacks, but the compiler complained about the "implicit any" there, too
这很自然。编译器不知道 XHR 的结果,如果你知道它使用一些接口指定它,或者你可以告诉编译器你不想要类型安全并使用 any
正如你已经在做的那样。
更新 1
I'm still stuck on the differences between dojo.promise.Promise, deferred.promise, and Deferred
承诺就是承诺:https://github.com/promises-aplus/promises-spec
Deferred 具有 promise
(.promise
) 以及漂亮的句柄(.resolve
和 .reject
)来确定所述 promise
.
我认为问题是 dojo.d.ts
中的 Deferred
和 Promise
类 似乎早就应该更新了。它们没有结果类型的通用类型参数,并且 then
回调只是 Function
,因此它们不捕获任何有关函数形状的信息。这没有利用 TypeScript 1.0,更不用说 1.4。
与es6-promise.d.ts
比较,其中Promise<R>
有一个方法then<U>
,其中R
是promise出来的值,U
是then
的解析处理程序产生的值,因此下一个承诺将是 Promise<U>
。所以 promise 的操作链是强类型的,一切都很好。
如果您对 dojo.d.ts
进行类似的改进并向他们设置拉取请求,他们可能会非常感激! :)