Я пытаюсь написать текстовую игру, в которой слово загружается из внешнего файла, полоса рисуется слева, а слово исходит справа, когда они сталкиваются, жизнь будет потеряна. Мне интересно, почему весь код должен быть во втором операторе if при загрузке файла. Почему нельзя просто не сделать управление файлами функцией?
var wordNo, letters, lines, arrLetters;
function getRandom(min, max) {
return Math.trunc(Math.random() * (max - min) + min);
}
var txtFile = new XMLHttpRequest();
txtFile.open("GET", "database.txt", true);
txtFile.onreadystatechange = function () {
if (txtFile.readyState === 4) {
if (txtFile.status === 200) {
allText = txtFile.responseText;
lines = txtFile.responseText.split("\n");
wordNo = getRandom(1, lines.length);
letters = lines[wordNo];
console.info(letters);
arrLetters = "";
arrLetters = letters.split("");
arrLetters.pop();
console.info(arrLetters);
}
}
};
txtFile.send(null);
Не понятно, о чем вы спрашиваете. Возможно, если бы вы показали пример того, что вы подразумеваете под "сделайте управление файлами функцией", было бы понятнее
Я имею в виду, что я хотел бы иметь все от "var txtFile" до console.info(arrLetters) в функции, которая возвращает "arrLetters"
Отвечает ли это на ваш вопрос? Как вернуть ответ при асинхронном вызове?
Если вы пытаетесь преобразовать запрос AJAX в функцию, которую вы можете вызвать и вернуть результат, вы можете использовать Promise.
Подробнее о промисах в JavaScript читайте здесь
function getArrLetters() {
return new Promise((resolve, reject) => {
var wordNo, letters, lines, arrLetters
function getRandom(min, max) {
return Math.trunc(Math.random() * (max - min) + min)
}
var txtFile = new XMLHttpRequest()
txtFile.open('GET', 'database.txt', true)
txtFile.onreadystatechange = function () {
if (txtFile.readyState === 4) {
if (txtFile.status === 200) {
allText = txtFile.responseText
lines = txtFile.responseText.split('\n')
wordNo = getRandom(1, lines.length)
letters = lines[wordNo]
console.info(letters)
arrLetters = ''
arrLetters = letters.split('')
arrLetters.pop()
resolve(arrLetters)
}
}
}
txtFile.onerror = reject
txtFile.send(null)
})
}
Современный способ
Если вам не нужна поддержка старых браузеров или вы транспилируете свой код в ES5 , вы можете написать это намного чище, используя синтаксис ES6 и Fetch API.
const random = (min, max) => Math.trunc(Math.random() * (max - min) + min)
async function getArrLetters() {
let allText = await fetch('database.txt').then((r) => r.text())
let lines = allText.split('\n')
let wordNum = random(1, lines.length)
let letters = lines[wordNum]
arrLetters = letters.split('')
arrLetters.pop()
return arrLetters
}
getArrLetters().then(arrLetters => {
// Use arrLetters here.
})
// Or from inside an async function:
async function yourFunction() {
var arrLetters = await getArrLetters()
}
Вы не можете напрямую вернуть результат из функции, потому что сетевой запрос изначально асинхронен.
Что вы подразумеваете под «сделайте управление файлами функцией»?