我应该如何声明返回没有数据的 $q 承诺的函数的返回类型?

Posted

技术标签:

【中文标题】我应该如何声明返回没有数据的 $q 承诺的函数的返回类型?【英文标题】:How should I declare the return type of a function that returns a $q promise with no data? 【发布时间】:2014-11-03 11:36:27 【问题描述】:

我有这个功能:

getMethod = (): ng.IPromise<any> => 
    if (1 == 2) 
        return this.$q.when();
    
    var defer = this.$q.defer();
    this.$http(
        url: '/abc',
        method: "GET"
    )
        .success((): void => 
            //
            defer.resolve();
        )
        .error((): void => 
            //
            defer.reject();
        )
    return defer.promise;

这没问题,返回的承诺不包含任何数据。

所以我把第一行改成:

getMethod = (): ng.IPromise<void> => 

现在我得到一个错误:

错误 3 无法将“ng.IPromise”转换为“ng.IPromise”: 'ng.IPromise' 和 'ng.IPromise' 类型的属性 'then' 类型不兼容:

有人可以就如何正确声明返回类型给我建议。我知道 using 有效,但如果函数真的总是返回 void,它似乎不是一个干净的解决方案。

【问题讨论】:

请为语言语法添加相关标签。 那么为什么你的promise没有用一个值来解决?它通常应该。顺便说一句,avoid the deferred antipattern 此代码还有更多内容,但针对此问题进行了简化。承诺返回成功或失败就足够了。 @Steve - 这似乎不是 ng.IPromise 接口规范中的一个选项 @SamanthaJ 将var defer = this.$q.defer();这一行改为var defer = this.$q.defer&lt;void&gt;();(明确指定void类型参数) 【参考方案1】:

我不确定我是否理解你想要做的事情,但是这个编译没有错误

   getMethod = (): ng.IPromise<void> => 
        var defer:ng.IDeferred<void> = this.$q.defer<void>();
        this.$http( url: '/abc', method: "GET").then(
            payload => defer.resolve(),
            error=> defer.reject()
        );
        return defer.promise;
    

这可能意味着您想知道操作已完成 我会选择观察者模式、消息传递、回调? 在我看来,promise 最好封装值,maybe_value,

【讨论】:

以上是关于我应该如何声明返回没有数据的 $q 承诺的函数的返回类型?的主要内容,如果未能解决你的问题,请参考以下文章

节点 q 承诺递归

我应该如何注释在 Python 中返回 ctypes 数组的函数?

有没有更好的方法在没有承诺的情况下返回异步数据?

如何返回一个失败的承诺?

JQuery 函数返回承诺,但“何时”仍然不等待

在返回函数的变量之前,如何等待 promise 完成?