如何使用TypeScript在Dojo中调用xhr

时间:2015-03-02 23:40:57

标签: dojo typescript

我使用的是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的方式?

2 个答案:

答案 0 :(得分:1)

  

TypeScript中是否存在以浏览器中立方式包装XMLHTTPRequest的内容

没有。 TypeScript具有非常最小运行时环境,仅用于帮助编译器生成有效代码(几乎只有__extends函数)。

  

我也喜欢lambda风格的回调,但编译器也抱怨“隐含任意”,

这很自然。编译器不知道XHR的结果,如果你知道它使用某个接口指定它,或者你可以告诉编译器你不想要类型安全并使用any就像你已经做的那样。

更新1

  

我仍然坚持dojo.promise.Promise,deferred.promise和Deferred之间的差异

承诺是承诺:https://github.com/promises-aplus/promises-spec

Deferred是具有promise.promise)以及精美句柄(.resolve.reject)以确定所述{{1}的命运的东西}。

答案 1 :(得分:0)

我认为问题是Deferred中的Promisedojo.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进行了类似的改进并将其设置为拉取请求,那么他们可能会非常感激! :)