关于用角度和打字稿链接$ q承诺的混淆

时间:2016-04-27 16:02:10

标签: javascript angularjs typescript promise q

我对Qpromisesangulartypescript缺乏经验 - 所以似乎明智的选择是尝试一起使用它们!

基本上我有一些方法设置来返回Q.IPromise<T>,以便我可以将then(f)语句链接到它们上面。它们都工作正常;

public Clear = (): Q.IPromise<IArticle> => {
        var deferred = this.$q.defer();
        this.$http({
            url: String.format('{0}{1}', this.$settings.uri(), '/api/cancel/article'),
            responseType: 'json',
            method: 'GET',
            withCredentials: true
        }).then((response: IArticleRequest) => {
            deferred.resolve(response.data.article);
        }, (response) => {
            deferred.reject(null);
        });
        return deferred.promise;
    }

public Fetch = (id: string):Q.IPromise<IArticleRequestData> => {
        var deferred = this.$q.defer();
        this.$http({
            url: String.format('{0}{1}{2}', this.$settings.uri(), '/api/articles/fetch/', id),
            responseType: 'json',
            method: 'GET',
            withCredentials: true
        }).then((response: IArticleRequest) => {
            deferred.resolve(response.data);
        }, (response) => {
            deferred.reject(null);
        });
        return deferred.promise;
    }

所以我可以像这样使用它们;

$articles.Fetch(1).then((r: IArticleRequestData) => {
    $articles.Clear().then((n:IArticle) => {
        console.log('completed!');
    })
});

这很好 - 而且正如我所料。

但现在,我需要另一个步骤 - 最后调用类型。另一个then(f)函数在最外层函数上运行,但在最里面的函数完成之前不会发生。

总之,我需要这个;

$articles.Fetch(1).then((r: IArticleRequestData) => {
    $articles.Clear().then((n:IArticle) => {
        // inner function completed
    })
}).then((l:any)=> {
    // occurs after everything else is done and inner
    // functions are finished
});

我很难搞清楚如何实现这一目标。承诺的工作方式是否可行?

额外备注

允许在内部部分添加另一个函数,但感觉就像错误的方法。这是我去&#34;修复&#34;如果我完全无法弄清楚我要问的方式,或者我试图做的方式是错误的。

我希望外部有额外的then,因为内部方法实际上负责解决某些事情,因此它们可能会分裂成其他切线或deferred方法。

1 个答案:

答案 0 :(得分:1)

只需从内部函数返回promise:

$articles.Fetch(1).then((r: IArticleRequestData) => {
    return $articles.Clear()
}).then((l:any)=> {
    // occurs after everything else is done and inner
    // functions are finished
});