【问题标题】:Promise fetch returning Promise<void | T> instead of expected objectPromise fetch 返回 Promise<void | T> 而不是预期的对象
【发布时间】:2018-11-03 03:51:20
【问题描述】:

我在一个类中使用 Typescript 进行简单的提取,它应该返回一个承诺,然后我想从这个提取中获取 JSON 响应。但是,无论我进行什么更改,该函数总是返回一个Promise&lt;void | T&gt;,这破坏了我代码中的类型检查。

export class ApiHelper {
    constructor() {     }

    public FetchFromPortal<T>(xyz: string) {

    ------ Other less relevant code -----------

        return fetch(url, options)
            .then((response) => this.CheckStatus(response))
            .then((response) => this.ParseJSON<T>(response))
            .then((response) => { 
                console.log(response);
                return response;
            })
            .catch((error: Error) => { console.log(error) });
    }

    private CheckStatus(response : Response) : Promise<Response> {
        if (response.status >= 200 && response.status < 300) {
            return Promise.resolve(response);
        } else {
            let error = new Error(response.statusText);
            throw error;
        }
    }

    private ParseJSON<T>(response : Response) {
        return response.json() as Promise<T>;
    }
}

我随后这样称呼它:

let result = apiHelper.FetchFromPortal<T>(xyz);

根据 Typescript,这将返回一个 Promise&lt;void | T&gt;。我试过像这样解决通话中的承诺:

let result = apiHelper.FetchFromPortal<T>(xyz).then(data => { return data });

理论上应该解决Promise,但这似乎不起作用。

promise 不只解决对象的任何原因?

【问题讨论】:

  • "显然是请求对象。" - - 不可能。你不会和console.log(response);混淆吗?
  • @zerkms 实际上是这样。我有一个流氓console.log,由于异步请求,我误读了订单。那时它是Pending Promise 状态。我会更新我原来的问题。
  • “但这似乎不起作用。” --- 这究竟是什么意思?你无法逃避承诺。一旦你进去了——你注定只能使用一个 Promise 对象。
  • @zerkms 我不想逃避它。我正在尝试解决承诺并从 fetch 中返回 json 对象。目前,无论我做什么,Promise 始终处于待处理状态。
  • Promise&lt;void | T&gt; 中的void 来自您的catch。如果发生错误,您的代码会吞下它,从而影响void。即如果有错误,则没有解析的T值。

标签: javascript typescript promise


【解决方案1】:

promise 没有解析为对象的任何原因?

原因如下:

        })
        .catch((error: Error) => { console.log(error) });

发生异常时,此处理程序将错误记录到控制台并且不返回任何内容。编译器看到这一点并将void union 成员添加到返回类型。

【讨论】:

  • 我实际上认为问题在于我的不耐烦并且没有正确记录这些事情。它在一秒钟左右后返回对象,但调用者已经继续处理代码并且不是“等待” Promise 解决。
  • "and is not "Waiting"" --- 不应该,这就是异步的概念。
【解决方案2】:

promise 不只解决对象的任何原因?

是的,承诺解析发生在某种“异步空间”上,调用将总是只返回一个承诺。承诺的结果只是通过then() 链转发并且从不返回给调用者(因为它们是异步的)。

但我认为您可以使用await 获得您所期望的行为:

let result = await apiHelper.FetchFromPortal<T>(xyz);

【讨论】:

  • await/async 绝对是更好的方法。我相信这实际上完全是由于我对异步调用的不耐烦,并且错误地调试/使用了 Promise 链,让我自己感到困惑。谢谢你的回答。
猜你喜欢
  • 2017-10-31
  • 2019-12-19
  • 2021-04-28
  • 2021-03-17
  • 2021-06-05
  • 2020-12-08
  • 2021-02-06
  • 2017-03-17
  • 2021-05-18
相关资源
最近更新 更多