@Aricus

Как сделать синхронный запрос через fetch?

Я пытаюсь сделать функцию, которая получает данные фирмы по ИНН:
function getDataByINN(inn) {
console.log(inn)
	let url = "https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/party";
	let token = "2dd89656b3d14b185a20dc252b1f3397b1be219";
	var options = {
		method: "POST",
		mode: "cors",
		headers: {
			"Content-Type": "application/json",
			"Accept": "application/json",
			"Authorization": "Token " + token
		},
		body: JSON.stringify({query: inn})
	}
	return fetch(url, options)
		.then(response => response.text())
		.then((data) => {
			if (typeof data.suggestions[0] !== undefined) {
				console.log(data.suggestions[0])
				return data.suggestions[0];
			} else {
				return false;
			}
		})
		.catch((error) => {
			console.log("error", error);
			return false;
		});
}
...
let myCopany = getDataByINN(myPersonPars['INN']);
console.log(myCopany);

Данные получаются правильные. Но, так как fetch работает асинхронно, в переменную, использующую функцию, записывается undefined, а уже потом приходят данные. Запихнуть дальнейший код в then не получится, так как он разбросан по нескольким js файлам.
Как заставить fetch работать синхронно, или переделать в другой вариант ajax (можно jquery), с отправкой заголовков и прочих данных?
  • Вопрос задан
  • 2035 просмотров
Решения вопроса 1
Immortal_pony
@Immortal_pony Куратор тега JavaScript
1. Можете воспользоваться XMLHttpRequest вместо fetch. В методе open можно явно указать, что запрос необходимо сделать синхронно. Подробная документация тут: https://javascript.info/xmlhttprequest
2. Можете воспользоваться тем что fetch возвращает promise и написать свой код соответствующим образом. Вы уже почти это сделали когда решили возвращать результат выполнения fetch. Осталось чуть-чуть, примерно так:

getDataByINN(myPersonPars['INN']).then((suggestion) => {
    const myCompany = suggestion
})
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@GrayHorse
Начать использовать оператор await. И не парить мозг.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы