Выполнение другой функции после чтения.Onload() в vue js

#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)
  })
  */
}