【发布时间】:2022-01-17 18:41:01
【问题描述】:
我正在尝试从异步函数返回一个函数(闭包)。到目前为止,我拥有 space 的方式始终是一个承诺而不是一个函数,即使它应该是一个闭包。
// ...
const [space, set_space] = React.useState(false);
React.useEffect(
() => {
API.SERVER(query, PAGE_SIZE)
.then(response => set_space(response));
},
[query]
);
React.useEffect(
() => {
console.log(space.constructor);
if (space) {
space(page)
.then(response => set_titles(Array.from(response.data)));
}
},
[space, page]
);
// ...
API
// ...
export default {
SERVER:async function(search, width)
{
if (!search) {
// return () => {};
search = DEFAULT_QUERY;
}
const all = (await axios.get(SEARCH_URL + `?search=${search}`)).data;
console.log(all);
const pages = chunk(all, width);
// function pager(results) {
// const dex = (results > width ? results / width : 0);
// const next = pages[dex];
// return axios.get(SEARCH_URL + `?fromids=${next}`);
// }
// return pager;
return function(results) {
const dex = (results > width ? results / width : 0);
const next = pages[dex];
return axios.get(SEARCH_URL + `?fromids=${next}`);
};
// return pager;
}
};
space.constructor 说它是一个 Promise,但它应该是一个返回 axios 的 Promise 的函数,而不是它自己的 Promise。我无法真正改变 API 的设置方式,因为我需要保持索引客户端,然后通过更改空间的参数来遍历它。
【问题讨论】:
-
如果您有一个返回值的函数,那么添加
async自动意味着它返回该值的Promise。 -
我不明白
space怎么可能是一个承诺。它是false或API.SERVER(…)返回的pager函数(混淆地也称为response)。您在哪里以及如何登录/检查space.constructor?您是否遇到某种错误? -
@Bergi 这对我来说也没有意义。早些时候,我有 SERVER
return function(results) // ...并且使用这种样式它不会立即崩溃,所以我可以在第二个 useEffect 中调用 space.constructor。 -
嗯,“space is not a function”是意料之中的,因为您使用
false初始化您的状态,这不是函数。但这与异步函数返回的闭包无关。 -
你能分享一个minimal reproducible example吗?我仍然不相信
console.log(space.constructor);会用你发布的代码打印Promise
标签: javascript reactjs async-await