【问题标题】:Unwrapping a Promise object in Typescript/JavaScript在 Typescript/JavaScript 中解开 Promise 对象
【发布时间】:2018-03-06 23:54:39
【问题描述】:

我是 JavaScript/TypeScript Promise 返回类型的新手。

问题是我托管了一个 REST API 端点,它在内部调用来自不同服务的另一个 API,该服务使用 JS 请求模块返回一个 Promise 对象。

我想解开内部 API 承诺响应并创建一个新的普通 Typescript 对象,最后返回新修改的响应对象而不是 Promise。

这是描述我的问题的示例代码:

export class SampleClass {
 public process(): NewResponse {
    const newResponse: NewResponse = new NewResponse();
    // invokeOtherAPI() call Returns a Promise by invoking a different endpoint
    invokeOtherAPI().then(function (result) {
        newResponse.propertyOne = result.propertyOne;
        newResponse.propertyTwo = result.propertyTwo;
    });
    return newResponse;
}}

在这种情况下 process() 返回一个空值,尽管它在 then() 中被赋值。

这是我的 REST API 控制器类(缺少路径装饰器)

export class SampleController() {
  const service: SampleClass = new SampleClass();
  public get(): NewResponse {
     return service.process();
  }
}

问题:

  1. 始终从 Typescript API 返回 Promise 对象是否是一种好习惯?
  2. 有没有一种方法可以在内部解开 Promise 对象并从 API 返回非 Promise 对象?

感谢您对此的任何帮助。

【问题讨论】:

  • 你可能想看看 async/await
  • 如果你希望能够同步解包它们,你显然不明白 Promise 的用途。
  • @poke,是的,你是对的。我几乎不知道承诺是如何运作的。但是以下答案(第一个答案)解释得很好。现在事情对我来说已经清楚了。谢谢。

标签: javascript rest typescript promise


【解决方案1】:

我想解开内部 API 承诺响应并创建一个新的普通 Typescript 对象,最后返回新修改的响应对象而不是 Promise。

你不能。如果你的 API 函数的任何部分是异步的,那么整个 API 必须是异步的,这意味着它必须返回一个调用者使用 .then()await 的承诺来获取值,或者你使用旧的样式回调,调用者传入一个你在异步值可用时调用的回调。

这里有更多解释:How do I return the response from an asynchronous call?

  1. 始终从 Typescript API 返回 Promise 对象是否是一种好习惯?

是的。如果操作是异步的,那么返回一个 Promise 是返回异步结果的理想方式。

  1. 有没有一种方法可以在内部解开 Promise 对象并从 API 返回非 Promise 对象?

没有。如果您真的不想使用 Promise,您可以使用较旧的回调样式来传达结果,但是调用者会遇到处理异步结果的相同问题,并且您不能直接从 API 返回结果.


在这段代码中:

export class SampleClass {
 public process(): NewResponse {
    const newResponse: NewResponse = new NewResponse();
    // invokeOtherAPI() call Returns a Promise by invoking a different endpoint
    invokeOtherAPI().then(function (result) {
        newResponse.propertyOne = result.propertyOne;
        newResponse.propertyTwo = result.propertyTwo;
    });
    return newResponse;
}}

在您执行return newResponse 的那一行出现问题。此时,newResponse 还没有值。你知道它有值的唯一地方是.then() 处理程序。这就是您不能直接从 API 返回结果的原因。您的 API 将在检索到值之前返回。这正是 promise 的用途。您返回承诺,调用者在返回的承诺上使用.then() 来获取值。

我自己不知道使用 TypeScript 的方式来执行此操作,因此您可以为返回值填写正确的语法,但这是在此处返回承诺:

export class SampleClass {
 public process(): <fill in promise return value type here> {
    const newResponse: NewResponse = new NewResponse();
    // return promise from this function
    return invokeOtherAPI().then(function(result) {
        newResponse.propertyOne = result.propertyOne;
        newResponse.propertyTwo = result.propertyTwo;
        // make newResponse be the resolved value of the promise
        return newResponse;
    });
}};

【讨论】:

  • 很好的解释。现在更清楚 Promise 是如何工作的了。谢谢。
  • 当然,@jfriend00。
猜你喜欢
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2020-06-27
  • 2021-08-16
  • 2017-02-13
  • 2019-01-01
  • 2017-03-14
  • 1970-01-01
相关资源
最近更新 更多