#javascript #fetch-api
Вопрос:
Приведенный ниже код работает на PHP, но не на JS. Можете ли вы сказать мне, почему? Как я могу заставить работать чистую версию JS?
async function cccrFlow() {
response = await fetch('assets/club_mems.json');
club_mems = [];
club_mems = await response.json(); // DOESN"T WORK
}
function cccrFlow() {
club_mems = <?php include('assets/club_mems.json');?>; // WORKS PERFECTLY
}
club_mems.json
[{"Name":"Ahmedistan, Jamshed","clubEXP":"2022-09-15"},{"Name":"Anaizi, Paul N","clubEXP":"2021-01-27"},{"Name":"Anderson, Simon","clubEXP":"2022-06-30"},{"Name":"Ashes, Bob P","clubEXP":"2022-04-21"}]
Комментарии:
1. Потому что PHP выполняет код синхронно и задолго до того, как какой-либо контент будет отправлен в браузер. В основном ваш второй пример JS видит только прямой вывод.
2. Итак, вы бы посоветовали придерживаться версии php, избегая версии async/await?
3. не могли бы вы предоставить нам журналы? браузер должен был сообщить что-то в консоли, если бы он обнаружил какие-либо ошибки
4. Откуда вы знаете, что версия JS не работает? Вы могли бы сделать
console.log(response.status, club_mems);
это для нас.
Ответ №1:
Когда вы используете fetch, вы должны убедиться, что любой загружаемый вами актив/ресурс — общедоступен. Короче говоря,
если вы используете этот URL-адрес в браузере http://yourserver.com/assets/club_mems.json
и можете увидеть ответ в браузере, то ваш fetch/async/await
будет работать (см. скриншот).
Если вы не хотите предоставлять свои данные в открытом доступе, вам придется включить файл JSON, используя один из методов загрузки модуля, т. е. import/require
.
Редактировать
Для достижения этой цели: вам необходимо иметь какой-то загрузчик модулей в вашей среде разработки. Загрузчик модулей позаботится о том, чтобы после создания приложения для среды prod ваш код включал данные JSON без каких-либо проблем.
Существуют различные варианты: webpack, bundlr, посылка и т.д. Проверьте их официальные веб — сайты, чтобы узнать, как их настроить.
Как только вы это настроите, вы можете просто написать в своем коде:
const jsonData = require("/path/to/club_mems.json");
or
import jsonData from "/path/to/club_mems.json"
Комментарии:
1. Как включить файл JSON, используя один из методов загрузки модуля, т. е. импорт/запрос?
2. Я обновил свой ответ, см. раздел «Редактирование».
Ответ №2:
попробуйте это решение:
function cccrFlow() {
club_mems = fetch('assets/club_mems.json')
.then(response => response.json())
.then(data => {
console.log(data)
alert(data);
})
}
Комментарии:
1. Я хотел использовать асинхронность и ожидание с выборкой.
2. Я думаю, что эта ссылка полезна для вас dmitripavlutin.com/javascript-fetch-async-await