我使用的是Typescript(新手)和Dojo,我需要进行异步调用。如果您不使用TypeScript,这非常容易。但是,编译器使事情变得更难,特别是因为我不允许"隐含任何"。我也喜欢lambda风格的回调,但编译器抱怨"隐含任何"那里也是。大多数情况下,我对Deferred和Promise以及如何导入promise模块感到困惑。
有没有任何有打字稿/道场经验的人可以告诉我,如果我做对了吗?而且,有什么方法可以改善它吗?
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的方式?
答案 0 :(得分:1)
TypeScript中是否存在以浏览器中立方式包装XMLHTTPRequest的内容
没有。 TypeScript具有非常最小运行时环境,仅用于帮助编译器生成有效代码(几乎只有__extends函数)。
我也喜欢lambda风格的回调,但编译器也抱怨“隐含任意”,
这很自然。编译器不知道XHR的结果,如果你知道它使用某个接口指定它,或者你可以告诉编译器你不想要类型安全并使用any
就像你已经做的那样。
承诺是承诺:https://github.com/promises-aplus/promises-spec我仍然坚持dojo.promise.Promise,deferred.promise和Deferred之间的差异
Deferred是具有promise
(.promise
)以及精美句柄(.resolve
和.reject
)以确定所述{{1}的命运的东西}。
答案 1 :(得分:0)
我认为问题是Deferred
中的Promise
和dojo.d.ts
类似乎早就应该进行更新了。它们没有结果类型的泛型类型参数,then
回调只是Function
,因此它们不会捕获函数的形状。这并没有利用TypeScript 1.0,更不用说1.4。
与es6-promise.d.ts
进行比较,其中Promise<R>
有方法then<U>
,其中R
是来自承诺的值,U
是值由then
的解析处理程序生成,因此下一个承诺将是Promise<U>
。所以对承诺的操作链是强类型的,一切都很好。
如果您对dojo.d.ts
进行了类似的改进并将其设置为拉取请求,那么他们可能会非常感激! :)