Как я могу создать класс, который будет предоставлять метод для получения JSON-объекта, с которым я смогу работать после вызова? Например, хочу, чтобы код выглядел так:
```javascript
let json = ajax.result('file.php'); // метод fetch, чтобы возвращал json-object
json.data[0].name;
json.data[1].name;
```
Однако у меня возникает проблема с возвращением промиса. Я пытаюсь обработать его с помощью метода `then` в другом методе класса, но пока не удается. Обработка данных происходит внутри метода, но передача значения — нет.
Вот структура моего класса:
```javascript
class Ajax {
result(data) { // (1)
let prom = this.load(data);
prom.then((v) => {
// alert(v) object все ок.
return v; // но это не работает
});
}
async load(url) { // (2)
try {
let f = await fetch(url);
if (!f.ok) {
throw new SyntaxError("Файл отсутствует"); // (*)
}
let json = await f.json();
if (Object.keys(json.result).length == 0) {
throw new SyntaxError("Данные отсутствуют: выборка пустого запроса"); // (*)
}
return json;
} catch (er) {
alert(`Ошибка: ${er}`); // TypeError: failed to fetch
}
}
}
let ajax = new Ajax;
ajax.result('file.php'); // undefined
```
Как мне правильно организовать возврат значения из метода `result`, чтобы оно было доступно после вызова?
Для того чтобы вернуть значение из метода `result`, который использует асинхронный код, нужно использовать промисы. Ваш метод `result` должен возвращать объект промиса, чтобы вы могли обрабатывать результат после его получения.
Вот переписанный код вашего класса:
```javascript
class Ajax {
result(data) { // (1)
// Возвращаем промис из метода result
return this.load(data).then((v) => {
return v; // возвращаем значение, полученное из load
});
}
async load(url) { // (2)
try {
let f = await fetch(url);
if (!f.ok) {
throw new SyntaxError("Файл отсутствует"); // (*)
}
let json = await f.json();
if (Object.keys(json.result).length == 0) {
throw new SyntaxError("Данные отсутствуют: выборка пустого запроса"); // (*)
}
return json;
} catch (er) {
alert(`Ошибка: ${er}`); // TypeError: failed to fetch
}
}
}
let ajax = new Ajax();
ajax.result('file.php').then(json => {
// Теперь json доступен здесь
console.log(json.data[0].name);
console.log(json.data[1].name);
}).catch(err => {
console.error("Произошла ошибка:", err);
});
```
**Основные изменения:**
1. Метод `result` теперь возвращает результат `this.load(data).then(...)`, который является промисом. Это позволяет `result` ожидать завершения загрузки данных.
2. В месте, где вызывается `result`, добавлен обработчик `then` для получения данных, как вы и хотели.
Теперь вы можете использовать запрашиваемые данные после загрузки, и они будут доступны внутри обработчика `then`. Это именно то, что вам нужно для работы с асинхронными вызовами в JavaScript.