![](/img/trans.png)
[英]To get a truthy condition(array) from a nested array, for now the function returns boolean value true
[英]Get a boolean value from async function and then validate an IF ELSE condition
這是代碼片段。 在這里,我想檢查圖像的寬度或高度是否超過 100,我想返回 true 以便我可以限制將此類文件/圖像上傳到數組。
const getHeightWidth = async () => {
const reader = new FileReader();
reader.readAsDataURL(file);
await reader.addEventListener('load', async (e) => {
const image = new Image();
image.src = reader.result;
await image.addEventListener('load', function () {
const { height, width } = this;
invalidFileHeightWidth = !!((height !== 100 || width !== 100));
return invalidFileHeightWidth;
});
});
};
我嘗試了 Promise.resolve 以及直接返回語句,但到目前為止沒有運氣
我會把它分成五個獨立的功能:
loadImageFromFile
~ Promise
使用FileReader
按filename
加載loadImage
~ 一個Promise
設置Image
object 的src
loadImageFromFile
~ 將以上兩個函數合並為一個調用isValidSize
~ 驗證給定圖像的寬度/高度previewFile
~ 用於偵聽文件輸入的事件處理程序 const previewFile = async () => { const preview = document.querySelector('img'); const file = document.querySelector('input[type=file]').files[0]; const image = await loadImageFromFile(file); const isValid = isValidSize(image); console.log(`Image size valid: ${isValid }`); preview.src = image.src; // Update preview }; const loadImageFromFile = async (file) => { const reader = await readFile(file); return loadImage(reader.result); }; const readFile = async (file) => new Promise((resolve, reject) => { const fileReader = new FileReader(); fileReader.readAsDataURL(file); fileReader.addEventListener('load', (e) => resolve(fileReader)); fileReader.addEventListener('error', (e) => reject(e)); }); const loadImage = async (imageData) => new Promise((resolve, reject) => { const image = new Image(); image.src = imageData; image.addEventListener('load', function (e) { resolve(this); }); image.addEventListener('error', function (e) { reject(e); }); }); const isValidSize = (image) => { const { height, width } = image; return width === 100 && height === 100; };
<input type="file" onchange="previewFile()" /><br /> <img src="" height="100" alt="Image preview" />
如果你想要一個巨型單片function,你可以嘗試:
注意:您使用它來僅檢查圖像是否有效。 如果您想對圖像執行更多操作,則需要再次加載圖像。 這就是為什么第一個例子是更好的選擇。 它將驗證與加載分開。
const preview = document.querySelector('img'); const previewFile = async () => { const preview = document.querySelector('img'); const file = document.querySelector('input[type=file]').files[0]; const isValid = await isValidSize(file); console.log(`Image size valid: ${isValid }`); }; const isValidSize = async (file, expectedWidth = 100, expectedHeight = 100) => new Promise((resolve, reject) => { const fileReader = new FileReader(); fileReader.readAsDataURL(file); fileReader.addEventListener('load', (e) => { const image = new Image(); image.src = fileReader.result; image.addEventListener('load', function (e) { const { height, width } = this; resolve(width === expectedWidth && height === expectedHeight); }); image.addEventListener('error', function (e) { reject(false); }); preview.src = image.src; // This is now coupled... }); fileReader.addEventListener('error', (e) => reject(false)); });
<input type="file" onchange="previewFile()" /><br /> <img src="" height="100" alt="Image preview" />
如果您想使用async
/ await
,您需要將事件包裝在Promise
構造函數中。
下面是一個簡單的工作示例,select 一個圖像文件,它會給你大小。
function getFileSize(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = e => { const image = new Image(); image.onload = e => resolve([image.width, image.height]); image.onerror = e => reject(e); image.src = reader.result; } reader.onerror = e => reject(e); reader.readAsDataURL(file); }); } document.querySelector('input').addEventListener('change', async e => { const span = document.querySelectorAll('span'); const size = await getFileSize(e.target.files[0]); span[0].innerText = size[0]; span[1].innerText = size[1]; });
span { font-weight: bold; }
<input type="file" accept="image/png, image/gif, image/jpeg"/> <div>width: <span></span></div> <div>height: <span></span></div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.