【问题标题】:How to return a proper Promise with TypeScript如何使用 TypeScript 返回正确的 Promise
【发布时间】:2017-01-07 08:51:00
【问题描述】:

所以我正在使用 typescript 学习 Angular 2。

我正在编写一个模拟服务,如果服务成功获取对象,它(我相信)应该返回一个 Promise,如果发生任何事情,则返回一个错误。

我尝试了以下代码,但看起来它不是打字稿的书写语法。

更新了代码:

saveMyClass(updatedMyClass: MyClass){
        //saving MyClass using http service
        //return the saved MyClass or error
        var savedMyClass : MyClass = someLogicThatReturnsTheSavedObject(updatedMyClass);
        if(isSomeCondition)
            return Promise.reject(new Error('No reason but to reject'));
        else
            return new Promise<MyClass>(resolve => {setTimeout( ()=>resolve(savedMyClass),1500  )}  );
    }

但令我惊讶的是,打字稿抱怨“返回表达式中不存在最佳通用类型”。

正确的代码应该是什么?这样我就可以在我的组件上使用是否返回正确的 MyClass 并反映服务中存在的错误。

谢谢

【问题讨论】:

标签: angular typescript es6-promise


【解决方案1】:

将整个函数体嵌入Promise 构造函数被认为是一种很好的做法,因此如果发生任何错误,它将被转换为拒绝。在这种情况下,我相信它也可以解决您的问题。

saveMyClass(updatedMyClass: MyClass) {
    return new Promise<Package>((resolve, reject) => {
        //saving MyClass using http service
        //return the saved MyClass or error
        var savedPackage : Package = updatedPackage;
        if (isSomeCondition) {
            throw new Error('No reason but to reject');
        }

        setTimeout( () => {
            resolve(savedPackage);
        }, 1500);
    });
}

【讨论】:

  • setTimeout 永远不应该用来控制这样的事情,但是由于 typescript 和 javascript 从根本上被破坏了,你也可以这样做,不管它有多荒谬。
  • @CarComp 此代码是对 OP 问题的直接回答,无需任何不必要的修改。
  • JavaScript 在许多地方确实从根本上被破坏了,但异步部分没有。与其他语言相比,javascript 中的异步相当好且简单。
猜你喜欢
  • 2022-11-29
  • 2019-09-28
  • 2021-10-17
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多