我正在创建一个钩子来从数据库中获取所有属性.该函数是异步的,当我在另一个函数中调用钩子时,它是[].我知道从数据库获取的函数是异步的,我知道它必须等待服务器的响应.我不完全理解它,我如何让钩子返回我需要的数据?

我在另一个函数中使用了相同的逻辑来获取属性,它起作用了,然而,我想把它放在一个钩子中,因为我将在程序的许多其他部分使用它.请不要在回答时表现得卑鄙和居高临下,我正在学习这就是我来这里询问的原因.

const getAllProperties = async () => {
  const propertyRef = ref(database, "properties");

  const getProperties = async () => (await get(propertyRef)).val();
  const [allProperties, setAllProperties] = useState([]);

  getProperties().then((properties) => {
    setAllProperties(properties ? Object.values(properties) : []);
  });
  console.log(allProperties);

  return allProperties;
};

推荐答案

你的逻辑在两个方面是不正确的

  • 之后访问该变量.然后将无法访问,请使用 等待,因为.Then之后的代码将在调用函数后不久运行
  • 状态变量在设置后不会立即更新
setCount(1)
console.log(count) // will print pervious value
const getAllProperties = async () => {
const propertyRef = ref(database, "properties");

const getProperties = async () => (await get(propertyRef)).val();
const [allProperties, setAllProperties] = useState([]); // no need of this

const properties = await getProperties()

setAllProperties(properties ? Object.values(properties) : []); // no need of this

console.log(properties);

return properties; // directly return it
};

Javascript相关问答推荐

验证嵌套 colored颜色 代码的结果

使用Apps Script缩短谷歌表中的URL?

从外部访问组件变量-Vueejs

如何解决这个未能在响应上执行json:body stream已读问题?

确定MutationRecord中removedNodes的索引

窗口.getComputedStyle()在MutationObserver中不起作用

调用removeEvents不起作用

为什么promise对js中的错误有一个奇怪的优先级?

数字时钟在JavaScript中不动态更新

阿波罗返回的数据错误,但在网络判断器中是正确的

如何将react—flanet map添加到remixjs应用程序

Angular 中的类型错误上不存在获取属性

IF语句的计算结果与实际情况相反

使用auth.js保护API路由的Next.JS,FETCH()不起作用

如何修复使用axios运行TSC index.ts时出现的错误?

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

Jexl to LowerCase()和Replace()

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

如果对象中的字段等于某个值,则从数组列表中删除对象