在Typescript / JavaScript中解开Promise对象

ptm*_*tmn 5 javascript rest promise typescript

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

问题是我托管了一个REST API终结点,该终结点在内部从另一个服务中调用另一个API,该服务使用JS Request模块返回一个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;
}}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,虽然在then()内部分配了process(),但它仍返回一个空值。

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

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

问题:

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

感谢您对此的任何帮助。

jfr*_*d00 5

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

你不能 如果您的API函数的任何部分是异步的,则整个API必须是异步的,这意味着它必须返回调用者使用.then()await继续使用的承诺才能获取值,或者您使用较旧的样式回调并且调用者通过在异步值可用时调用的回调中。

这里还有很多解释:如何从异步调用返回响应?

  1. 始终从Typescript API返回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;
}}
Run Code Online (Sandbox Code Playgroud)

事情就像你所做的事情一样出错return newResponse。到那时,newResponse还没有价值。您知道它具有值的唯一位置是.then()处理程序内部。这就是为什么您不能直接从API返回结果的原因。您的API将在获取值之前返回。这正是诺言的目的。您返回承诺,调用者将使用.then()该返回的承诺来获取值。

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

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;
    });
}};
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

3728 次

最近记录:

8 年,5 月 前