Как я могу вернуть данные из promise, а затем передать их через prop в компоненте react

#reactjs #expo #es6-promise

#reactjs #выставка #es6-обещание

Вопрос:

Я в большой борьбе. Я пытаюсь передать данные в useState из sendID, потому что мне нужно, чтобы они передавались в реквизиты моего компонента Exposition, но не были определены.

Я не могу вернуть его, потому что он возвращает обещание.

 import React, { useState, useEffect } from "react";
import DataService from "../services/Services";
import * as SecureStore from 'expo-secure-store';
import Expositions from "./Expositions";


const Authenticate = () => {

  const[code, setCode] = useState();

  SecureStore.getItemAsync("device_id").then((response) => {
    console.log("stored id : "   response);
    sendId({"id" : response});
    }
  );
  
    function sendId(deviceId){
      console.log("object id send to api : "   JSON.stringify(deviceId));
      DataService.getInfo(JSON.stringify(deviceId))
        .then((response) => {
          SecureStore.setItemAsync("device_id", response.id);
          console.log("id from api : "   response.id);
          console.log(response.response);
          console.log("here");
          setCode({"id" : 3}); //does'nt work
        })
        .catch((e) => {
          console.log(e);
        });
    }

    //SecureStore.deleteItemAsync("device_id").then((reject) => {
    //});

    console.log("Data :"   JSON.stringify(code)); //undefined
    return (
      <Expositions infections={code}/> //undefined
    );
  
  };
  export default Authenticate;
 

Комментарии:

1. sendId и getId не являются компонентами и не являются пользовательскими крючками, они не могут использовать useState hook. Исправьте это, затем определите некоторое допустимое начальное состояние и поместите служебные функции в useEffect хук с надлежащей зависимостью, чтобы они не вызывались каждый цикл рендеринга. Ваши async функции ничего не await делают, поэтому их не нужно объявлять async . Условный рендеринг Expositions или обеспечение Expositions могут обрабатывать обновленные реквизиты.

Ответ №1:

Внутри ваших асинхронных функций используйте оператор await и не используйте .then для обещаний, таких как SecureStore.getItemAsync and DataService.getInfo . Если вы не используете await, эти функции вернут значение до завершения выполнения обещания.