diff --git a/src/assets/js/utils.js b/src/assets/js/utils.js index f4b0632..9aa5eb1 100644 --- a/src/assets/js/utils.js +++ b/src/assets/js/utils.js @@ -30,17 +30,73 @@ class Utils { console.log('[JSONP]', data); }, }; - var scriptElem = document.createElement('script'); + var el = document.createElement('script'); Object.assign(config, options); window[config.cbName] = config.cbFunc; - scriptElem.addEventListener('load', function () { + el.addEventListener('load', function () { this.remove(); }); - scriptElem.setAttribute('src', config.url); + el.setAttribute('src', config.url); - document.body.appendChild(scriptElem); + document.body.appendChild(el); + } + + /** + * 以文本方式读取文件(异步) + * + * @param {Event} ev 输入框 change 事件对象 + * @param {boolean} resetValue 是否自动重置输入框 value 属性 + * + * @returns {Promise} `{ name: 文件名, content: 文件内容 }` + */ + readFileAsText(ev, resetValue) { + const blank = []; + + /** @type {HTMLInputElement} */ + const el = ev.currentTarget; + + /** @type {FileList} */ + const files = el.files; + + if (!files || files.length === 0) { + return Promise.resolve(blank); + } + + const fnProc = (procResolve, procReject) => { + const reads = []; + + for (let i = 0; i < files.length; i++) { + const file = files[i]; + const reader = new FileReader(); + const fnRead = (readResolve, readReject) => { + // 成功 + reader.onload = () => { + readResolve(reader.result); + }; + // 失败 + reader.onerror = () => { + readReject(''); + }; + // 读取 + reader.readAsText(file); + }; + + reads.push(new Promise(fnRead)); + } + + Promise.all(reads).then((res) => { + // [成功] + procResolve(res); + resetValue && el.setAttribute('value', ''); + }).catch(() => { + // [失败] + procReject(blank); + }); + }; + + return new Promise(fnProc); } }