Как вернуть значение Промиса из функции, используя метод .then?

Как я могу создать класс, который будет предоставлять метод для получения 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`, чтобы оно было доступно после вызова?
  • 28 октября 2024 г. 23:12
Ответы на вопрос 1
Для того чтобы вернуть значение из метода `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.
Похожие вопросы