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

Posted

技术标签:

【中文标题】关于用 Angular 和 typescript 链接 $q 承诺的困惑【英文标题】:confusion about chaining $q promises with angular and typescript 【发布时间】:2016-08-22 01:29:06 【问题描述】:

我对 Qpromisesangulartypescript 非常缺乏经验 - 所以显然明智的选择是尝试将它们全部一起使用!

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

public Clear = (): Q.IPromise<IArticle> => 
        var deferred = this.$q.defer();
        this.$http(
            url: String.format('01', 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('012', 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!');
    )
);

效果很好 - 正如我所期望的那样。

但现在,我需要 另一个 步骤 - last 调用之类的。另一个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
);

我很难弄清楚如何做到这一点。这甚至可以通过 Promise 的工作方式实现吗?

补充说明

在内部部分添加另一个功能是允许的,但感觉是错误的方法。如果我完全无法弄清楚我要问的方式,或者我试图这样做的方式是错误的,这就是我的“修复”。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

Hrnm。这仅在调用 Clear 函数时才有效。如果在第一个 then() 中发生不同的事情,我还能做些什么来达到这一步吗? 我不确定你的意思。您可以在 then 方法中返回任何承诺并链接到它。由于您可以做出自己的承诺,因此您可以让他们为所欲为。 我想我明白了。非常感谢!

以上是关于关于用 Angular 和 typescript 链接 $q 承诺的困惑的主要内容,如果未能解决你的问题,请参考以下文章

[Angular]关于ngModel与ngModelChange

关于何时在 TypeScript 中调用装饰器的困惑

Angular 2、TypeScript 和 ui-router - 如何获取状态参数

TypeScript(Angular)中的MVVM模式[关闭]

我如何实际部署 Angular 2 + Typescript + systemjs 应用程序?

Angular 库应该用 typescript 编写还是编译成 javascript