繁体   English   中英

关于用 angular 和 typescript 链接 $q 承诺的困惑

[英]confusion about chaining $q promises with angular and typescript

我对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
});

我很难弄清楚如何做到这一点。 这甚至可能与承诺的工作方式有关吗?

额外的笔记

向内部添加另一个功能是允许的,但感觉是错误的方法。 如果我绝对无法弄清楚我所询问的方式,或者我尝试这样做的方式是错误的,那么这就是我要“修复”的方法。

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

只需像这样从内部函数返回承诺:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM