React native: как получить данные из 1 функции и передать их функции номер 2? - PullRequest
1 голос
/ 04 августа 2020

Как получить данные из функции getUserConnectRequestData и передать их в функцию getUserConnectResponseData? как вы можете видеть, я пытаюсь использовать then и responseData для сохранения данных функции getUserConnectRequestData, а затем я пытаюсь передать их в функцию getUserConnectResponseData, но это не работает.

getUserConnectRequestData().then(() => {
          responseData();
        });

, а это функция getUserConnectResponseData, в которую я хочу передать данные из getUserConnectRequestData

export const getUserConnectResponseData = (responseData) => {
  return new Promise((resolve, reject) => {
    // console.log('THIS IS MY RESPONSE ==============>>>>>>>>>>>', responseData);
    try {
      fetch(
        'https://hghghgghghg3223223',
        {
          method: 'POST',
          headers: {
            Accept: 'application/json',
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            Req_Type: responseData.Req_Type,
            Language_Code: responseData.Language_Code,
            User_ID: responseData.User_ID,
            Session_ID: responseData.Session_ID,
            Session_Key: responseData.Session_Key,
            Client_Type: responseData.Client_Type,
            Req_Data: {
              Bridge_ID: responseData.Bridge_ID,
            },
          }),
        }
      )
        .then((response) => response.json())
        .then((jsonResponse) => {
          resolve(jsonResponse);
        });
    } catch (error) {
      reject(error);
    }
  });
};

1 Ответ

0 голосов
/ 04 августа 2020

Вам необходимо принять параметр и использовать его, а также вызвать нужную функцию:

getUserConnectRequestData().then((responseData) => {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^
    getUserConnectResponseData(responseData);
// −^^^^^^^^^^^^^^^^^^^^^^^^^^−^^^^^^^^^^^^
});

Но поскольку getUserConnectResponseData принимает только этот один параметр, вы знаете, что обратный вызов then будет вызываться только с одним единственным аргументом:

getUserConnectRequestData().then(getUserConnectResponseData);

Вам также необходимо обрабатывать ошибки, поэтому:

getUserConnectRequestData()
.then(getUserConnectResponseData)
.catch(error => {
    // Handle/report error
});

Есть еще пара вещей, на которые стоит обратить внимание:

  1. getUserConnectRequestData становится жертвой антишаблона обещаний: new Promise вам не нужно, когда у вас уже есть обещание (от fetch) использовать.

  2. Вам необходимо проверить HTTP-успешность перед вызовом .json() в ответе. К сожалению, fetch отклоняет только ошибки сети , но не ошибки HTTP.

Вот обновленная версия getUserConnectRequestData:

export const getUserConnectResponseData = (responseData) => {
    return fetch('https://hghghgghghg3223223', {
        method: 'POST',
        headers: {
            Accept: 'application/json',
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            Req_Type: responseData.Req_Type,
            Language_Code: responseData.Language_Code,
            User_ID: responseData.User_ID,
            Session_ID: responseData.Session_ID,
            Session_Key: responseData.Session_Key,
            Client_Type: responseData.Client_Type,
            Req_Data: {
                Bridge_ID: responseData.Bridge_ID,
            },
        }),
    })
    .then((response) => {
        if (!response.ok) {
            throw new Error("HTTP error " + response.status);
        }
        return response.json();
    });
};

Из-за этой необходимости в проверке я никогда не использую fetch напрямую, у меня есть обертки для проверки, поэтому мне не нужно кодировать ее каждый раз.

// General purpose
function fetchGeneral(...args) {
    return fetch(...args)
    .then((response) => {
        if (!response.ok) {
            throw new Error("HTTP error " + response.status);
        }
        return response;
    });
}

// JSON
function fetchJSON(...args) {
    return fetch(...args)
    .then((response) => {
        if (!response.ok) {
            throw new Error("HTTP error " + response.status);
        }
        return response.json();
    });
}

Те отклоняют оба ошибки сети и HTTP.

...