javascript - 迭代 Firebase 存储 URL 时如何在 React 中使用 Async 和 Await
问题描述
我正在使用 Firebase api 获取目录中所有文件的列表,然后我有一个forEach
循环,我在其中获取 url 并将它们推送到临时数组中。最后我setUrls
到临时数组但是当我控制台日志urls
它是空的。我想我需要在代码中添加async
和await
,我已经尝试过了,它可能不起作用,可能是因为代码的结构是错误的,但我找不到任何关于如何以正确方式执行此操作的示例。
import React, { useState, useEffect, useRef } from 'react';
import firebase from "firebase/app";
import storage from "firebase/storage";
import firebaseConfig from "../dropzone/config";
import {
BrowserRouter as Router,
Switch,
Route,
Link,
useRouteMatch,
BrowserRouter,
useParams
} from "react-router-dom";
if (!firebase.apps.length) {
firebase.initializeApp(firebaseConfig);
}else {
firebase.app(); // if already initialized, use that one
}
const FolderPage = () => {
let {folder} = useParams();
let fb_storage = firebase.storage();
let storageRef = fb_storage.ref();
let rootRef = storageRef.child(folder);
console.log(rootRef);
const [files, setFiles] = useState([]);
const [urls, setUrls] = useState([]);
const fileNames = async () =>{
rootRef.listAll().then( async function(res) {
let temp = [];
res.prefixes.forEach(function(folderRef) {
});
res.items.forEach( async function(itemRef) {
// All the items under listRef.
temp.push(itemRef.name)
console.log(itemRef.name);
});
setFiles(temp);
}).catch(function(error) {
// Uh-oh, an error occurred!
});
let tempUrls = [];
files.forEach(async function(file){
var fileRef = storageRef.child( folder + '/' + file);
// Get the download URL
await fileRef.getDownloadURL()
.then((url) => {
tempUrls.push(url);
// console.log(tempUrls)
})
.catch((error) => {
switch (error.code) {
case 'storage/object-not-found':
// File doesn't exist
break;
case 'storage/unauthorized':
// User doesn't have permission to access the object
break;
case 'storage/canceled':
// User canceled the upload
break;
// ...
case 'storage/unknown':
// Unknown error occurred, inspect the server response
break;
}
});
})
setUrls(tempUrls);
console.log(urls);
}
useEffect(()=>{
fileNames();
},[])
return (
<>
<div>hello {folder}</div>
{/* <div>hello {folders}</div> */}
<ul>
{files.map((file, index) => {
return <li key={index}> {file}</li>
})}
</ul>
<div>
{urls.map((url, index) => {
return <a key={index} href={url}> {url} </a>
})}
</div>
</>
)
}
export default FolderPage
解决方案
推荐阅读
- ios - 将 .caf 音频文件快速转换为 .wav 音频文件
- next.js - Tailwindcss CSS 和字体不适用于生产
- flutter - 如何在颤动的html组件中添加滚动条
- python-3.x - Matplotlib - 带日期的水平条形图时间线 - Xticks 不显示日期
- highcharts - Highchart 缩放功能不起作用。它在 https://jsfiddle.net/f0n31uqx/
- c# - 如何在文本框下显示表格
- c++ - 在模板化类中构造对象所需的异常初始化
- java - Spring Cloud and vault integration error Caused by: java.lang.ClassNotFoundException: ConfigurationBeanFactoryMetadata
- eloquent - 有没有办法在 laravel eloquent 模型上使用 create() 方法,其中数据会调用相应的 set{field}Attribute 方法?
- python - TypeError: _init_() 接受 1 个位置参数,但给出了 5 个