У меня возникают проблемы с использованием «вложенных» вызовов Fetch в функции React Native. Вроде первый Fetch работает правильно, а вот на втором выдает ошибку. Вот код:
//****CALL TWO FETCH REQUESTS...
const data = { passkey: '12345', callup: 'name' };
const secondary = { passkey: '12345', callup: 'name' };
fetch('https://myremoteserveraddress', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then(function(response) {
if (response.ok) {
return response.json();
} else {
return Promise.reject(response);
}
})
.then(data => {
// Store the post data to a variable
_post = data;
console.info('Success on FIRST FETCH:', data);
console.info('answer is:', data.answer);
console.info('answer is:', _post.answer);
// Fetch another API
fetch('https://myremoteserveraddress', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(secondary),
})
})
.then(function (response) {
if (response.ok) {
return response.json();
} else {
return Promise.reject(response);
}
})
.then(function (userData) {
console.info('Returned from BOTH fetch calls'); //does not write to console
console.info(_post, userData); //does not write to console
this.vb.start();
})
.catch((error) => {
console.error('Error in onPressPublishBtn:', error);
});
//****
Кажется, что второй вызов Fetch возвращает «undefined», несмотря на то, что он идентичен первому вызову Fetch, который, кажется, работает успешно. Возвращенная ошибка: «TypeError: undefined не является объектом (оценка 'response.ok')». Если кто может подсказать в чем может быть проблема буду очень признателен. Заранее спасибо.
Спасибо за ваш ответ. Это решило проблему, однако теперь я получаю ту же ошибку относительно "this.vb.start();" в блоке ".then", который выполняется после второго вызова Fetch. Это работало раньше, когда я использовал только один Fetch ... есть идеи, почему?
Еще раз спасибо за информацию. Извините, но я нахожу этот демонический язык чрезвычайно запутанным. Со страницы, на которую вы ссылаетесь, кажется, что использование функции стрелки было бы подходящим способом... однако я не уверен, как передать ей "vb.start"... Я использовал "hello = () => {vb .start();}" внутри этого ".then", который выполняется после двух операторов Fetch. Я не получаю сообщение об ошибке, но, похоже, оно тоже ничего не дает, оно просто игнорируется... есть ли какой-нибудь способ передать "vb.start" в функцию стрелки, чтобы заставить ее выполняться? Должен ли он быть внешним по отношению к блоку «.then»? Еще раз спасибо.
.then((userData) => { this.vb.start(); }). И все, что разрабатывалось более 25 лет с сильными устаревшими ограничениями («сеть не сломать!»), будет запутанным.
Спасибо за ответ. Наконец-то у меня появилась возможность попробовать это... и, кажется, оно работает. Я благодарна вам за помощь, очень признательна.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны вернуть Promise из второго блока then(...), чтобы ответ был передан в третий блок then(...). Возможно, вы захотите попробовать что-то вроде этого:
// Fetch another API
return fetch('https://myremoteserveraddress', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(secondary),
})
Спасибо за ваш ответ. Как мой комментарий выше, это решило проблему, однако теперь я получаю ту же ошибку, что и "this.vb.start();" в блоке ".then", который выполняется после второго вызова Fetch. Это работало раньше, когда я использовал только один Fetch ... есть идеи, почему?
Вы используете классическую функцию Javascript в третьем блоке fetch(...). Классическая функция Javascript привязывает this к новой области видимости, что означает, что this.vb не определена. Напротив, стрелочные функции наследуют родительскую область. Вы должны попробовать это в блоке last then(...): .then((userData) => { ... }) Примечание: рассмотрите возможность использования асинхронного шаблона ожидания.
Спасибо за ваш ответ. Ваш ответ в основном такой же, как и у Джареда Смита выше. Поэтому это тоже правильно! Я полагаю, что «возврат» во втором Fetch создает новую область видимости... верно? Я ценю совет, спасибо еще раз. С уважением.
Вы не возвращаете вторую выборку в своих связанных обработчиках
.then, поэтому ответ не определен.