Дождаться завершения запроса ajax в React?

-2

Ниже мой код взаимодействия я хочу, чтобы во-первых, код ajax должен выполняться, тогда остальная часть кода должна выполняться.

ожидаемый вывод в консоли:

внутри ajax

вне ajax

текущий выход в консоли:

вне ajax

внутри ajax

import React from 'react';
import request from 'superagent'

 const UserItems = () => {
 request.get('http://localhost:4000/user/1/items.json') 
 .then((res, err) => {
    if (err) {
      console.log("errror found") 
    }
  var data = JSON.parse(res.text)
  console.log("inside ajax")
  console.log(data)

  })

 console.log("outside ajax")
 console.log(data)
};

export default UserItems;

Любое предложение !!!

  • 0
    Если вы хотите заблокировать выполнение некоторого кода до тех пор, пока запрос ajax не завершит обработку, поместите этот код (вне зависимости от того, что находится снаружи) в then() . Иначе, console.log("outside") всегда будет выполняться первым, поскольку код внутри then() будет выполняться только после получения ответа.
  • 0
    @SangeethSudheer: раньше я делал это, но выдает ошибку «Предупреждение: UserItems (...): должен быть возвращен действительный элемент React (или ноль). Возможно, вы вернули undefined, массив или другой недопустимый объект.
Теги:

2 ответа

1

Как указывает hainguyen, ajax обычно является асинхронным, поэтому код будет работать до тех пор, пока запрос не будет завершен, и в это время будет выполняться внутренняя функция. Таким образом, журналы внешних консолей почти наверняка будут запускаться сначала в вашем коде. Хотя есть способы обойти это, как указывает hainguyen, большинство рекомендуют против него. Ajax - это то, что требует времени, и поэтому ваша структура кода должна отражать это. Если вы когда-нибудь захотите запустить код во время выполнения запроса ajax, вам может не понравиться синхронная структура. Мой журнал "Я жду никого" показывает силу асинхронного подхода, так как эта логика будет работать быстро, в то время как вы обычно ожидаете запроса без возможности чего-либо сделать.

Вместо того, чтобы сделать его синхронным, почему бы не использовать функции для обработки асинхронного поведения лучше, чем обертывание, что вы хотите запустить после внутреннего входа в журнал в функции: (я назвал его наружу()). Это выведет "внутри ajax", "вне ajax" ". Таким образом, вы можете создавать зависимости от вашего возврата ajax и все еще иметь возможность запускать материал тем временем.

import React from 'react';
import request from 'superagent';

 const UserItems = () => {
 request.get('http://localhost:4000/user/1/items.json') 
 .then((res, err) => {
    if (err) {
      console.log("errror found");
    }
    var data = JSON.parse(res.text);
    console.log("inside ajax");
    console.log(data);
    outside();
   });

  function outside(){
    console.log("outside ajax");
    console.log(data);
  }

  console.log("I wait for no one, run me as quick as possible!");
};

export default UserItems;
0

Я не знаю о библиотеке запросов, но по умолчанию ajax async. Если вы хотите, чтобы ajax выполнил запрос синхронизации, вы должны сделать что-то вроде этого:

function getRemote() {
   return $.ajax({
     type: "GET",
     url: remote_url,
     async: false
   }).responseText;
}

Важная строка: async: false

  • 0
    Соглашение JQuery, чтобы сделать это, я использую реагировать с суперагентом для вызовов API.
  • 0
    Вы должны взглянуть на документ API библиотеки, я думаю, что он должен иметь эту настройку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню