【发布时间】:2020-11-01 15:57:57
【问题描述】:
我有一个基于 Promise 的 API 服务,它从我的后端请求数据。它还带有自己的错误捕获,所以我不必到处写它。写成这样的时候:
BackendService.ts
...
getTasks() {
return axios.get('/api/tasks')
.then((response) => {
const {
tasks
}: {
tasks: tasksType
} = response.data;
return tasks;
})
.catch((error) => console.log(error));
}
...
Entries.tsx
...
const getTasks = () => {
backendService.getTasks()
.then((tasks: tasksType) => {
const filteredTasksData = filterAPIDataForState(tasks);
addTasks({
tasks: filteredTasksData
});
})
}
...
我收到以下错误:
TS2345: Argument of type '(tasks: tasksType) => void'
is not assignable to parameter of type '(value: void | tasksType) => void | PromiseLike<void>'.Types of parameters 'tasks'
and 'value'
are incompatible.Type 'void | tasksType'
is not assignable to type 'tasksType'.Type 'void'
is not assignable to type 'TaskInterface[]'.
我猜这是因为 catch,这可能会使 Promise 什么也不返回(因为 console.log)。如果我从 Entries.tsx 给 getTasks 它自己的 catch 处理程序并将其从 BackendService.ts getTasks 中删除,它就可以工作。
如果出现错误,Typescript 是否应该能够判断 Entries.tsx 中的 .then() 不会运行,因为已经有处理这种情况的捕获?
【问题讨论】:
-
在 BackendService.ts 您正在返回 tasks 变量,这不是一个承诺。如果要提取数据,请使用 await 或 Axios .then() 中的函数。见Promise docs。请参阅Axios example 并选择最适合您和您的项目的方法。 PS:由于您使用的是Typescript,我建议您选择await。
-
@CarloCorradini 从我在Mozilla page 中看到的(见链接代码),你可以返回一个变量,下面的
.then()将能够使用它。 -
试试this。 @Yousaf 据我所知,没有返回任何承诺:\
-
@CarloCorradini:这就是 promise 的工作方式。在
.then()中返回的 ANYTHING 被包装在 Promise 中。类似于在用async关键字标记的函数内返回的任何内容都会返回一个promise。因此return tasks返回任务的承诺。请阅读 promises 和 async/await 是如何工作的 -
@Vincent 不,没有。您必须考虑
getTasks()在每次单独调用时均不返回任何内容(发生错误时)的情况,并适当地处理它(例如向用户显示错误消息)或转发错误。如果其中许多处理程序做同样的事情,您当然可以通过将相同的函数传递给每个.catch()来共享代码。
标签: javascript typescript promise axios