Проблема с вызовом «двойной выборки» в React Native

У меня возникают проблемы с использованием «вложенных» вызовов 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')». Если кто может подсказать в чем может быть проблема буду очень признателен. Заранее спасибо.

Вы не возвращаете вторую выборку в своих связанных обработчиках .then, поэтому ответ не определен.

Jared Smith 17.12.2020 19:03

Спасибо за ваш ответ. Это решило проблему, однако теперь я получаю ту же ошибку относительно "this.vb.start();" в блоке ".then", который выполняется после второго вызова Fetch. Это работало раньше, когда я использовал только один Fetch ... есть идеи, почему?

Pangit 17.12.2020 19:24
stackoverflow.com/questions/20279484/…
Jared Smith 17.12.2020 19:52

Еще раз спасибо за информацию. Извините, но я нахожу этот демонический язык чрезвычайно запутанным. Со страницы, на которую вы ссылаетесь, кажется, что использование функции стрелки было бы подходящим способом... однако я не уверен, как передать ей "vb.start"... Я использовал "hello = () => {vb .start();}" внутри этого ".then", который выполняется после двух операторов Fetch. Я не получаю сообщение об ошибке, но, похоже, оно тоже ничего не дает, оно просто игнорируется... есть ли какой-нибудь способ передать "vb.start" в функцию стрелки, чтобы заставить ее выполняться? Должен ли он быть внешним по отношению к блоку «.then»? Еще раз спасибо.

Pangit 17.12.2020 21:37
.then((userData) => { this.vb.start(); }). И все, что разрабатывалось более 25 лет с сильными устаревшими ограничениями («сеть не сломать!»), будет запутанным.
Jared Smith 17.12.2020 22:46

Спасибо за ответ. Наконец-то у меня появилась возможность попробовать это... и, кажется, оно работает. Я благодарна вам за помощь, очень признательна.

Pangit 18.12.2020 14:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
640
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны вернуть 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 ... есть идеи, почему?

Pangit 17.12.2020 19:25

Вы используете классическую функцию Javascript в третьем блоке fetch(...). Классическая функция Javascript привязывает this к новой области видимости, что означает, что this.vb не определена. Напротив, стрелочные функции наследуют родительскую область. Вы должны попробовать это в блоке last then(...): .then((userData) => { ... }) Примечание: рассмотрите возможность использования асинхронного шаблона ожидания.

matej bobaly 17.12.2020 21:58

Спасибо за ваш ответ. Ваш ответ в основном такой же, как и у Джареда Смита выше. Поэтому это тоже правильно! Я полагаю, что «возврат» во втором Fetch создает новую область видимости... верно? Я ценю совет, спасибо еще раз. С уважением.

Pangit 18.12.2020 14:42

Другие вопросы по теме