#javascript #vue.js #vuejs2 #filereader
Вопрос:
Мне нужно прочитать текстовый файл и передать данные в качестве объекта другой функции в vue2. Функция uploadBulk считывает текстовый файл, и функция submitBulk() будет выполнена только после завершения чтения файла. Но теперь submitBulk() выполняется до и во время печати объекта внутри submitBulk, он возвращает ошибку о том, что объект не определен или равен нулю. У меня есть следующий код-
uploadBulk: function (){
if (this.qCategory == 'MCQ') {
var questions = []
var file = this.$refs.uploadedFile.files[0];
if (file) {
var reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onload = () => {
/// mcq
var str = reader.resu<
const obj = str.split(/n/u).reduce((acc, line, i) => {
if (i%2===0) acc.questions.push({"body":line.match(/(. )(.*)/u)[1].trim()}); // remove the (X) from the question
else {
const curItem = acc.questions[acc.questions.length - 1]; // last pushed object
let [optionStr, answer] = line.split(/। /u);// split on this special character
// assuming 4 options
curItem.options = optionStr
.match(/(. ) (. ) (. ) (. ) (. ) (. ) (. ) (. )/u)
.slice(1); // drop the first element from the result (full match)
answer = answer.match(/((. ))/u)[1]; // just get the letter from the bracket
curItem.answers = [answer];
curItem.type = "MCQ"
}
return acc
}, {questions: []})
this.submitBulk()
}
};
}
}
Ответ №1:
Доза этой асинхронной/ожидающей помощи кода?
uploadBulk: async function () {
const file = this.$refs.uploadedFile.files[0]
if (!file || this.qCategory !== 'MCQ') return
/// mcq
const questions = []
const str = await file.text() // wait for text to be read
const lines = str.split(/n/u)
for (let i = 0; i < lines.length; i ) {
const line = lines[i]
if (i % 2 === 0) {
questions.push({
// remove the (X) from the question
body: line.match(/(. )(.*)/u)[1].trim()
})
} else {
const curItem = questions[questions.length - 1] // last pushed object
let [optionStr, answer] = line.split(/। /u) // split on this special character
// assuming 4 options
curItem.options = optionStr
.match(/(. ) (. ) (. ) (. ) (. ) (. ) (. ) (. )/u)
.slice(1) // drop the first element from the result (full match)
curItem.answers = [
answer.match(/((. ))/u)[1] // just get the letter from the bracket
]
curItem.type = 'MCQ'
}
}
this.submitBulk()
/**
// TODO: Do something with `questions` or `obj`
const obj = { questions }
return obj
// TODO: Then get the result with
uploadBulk.then(obj => {
console.log(obj)
})
*/
}