Как правильно изменить значения в Formik перед отправкой в ​​Firebase? - PullRequest
2 голосов
/ 01 мая 2020

Я пытаюсь отправить широту и долготу адреса в базу данных Firebase. Как ни странно, значение выходит из системы, но не будет отправлено в базу данных.

Я использую библиотеку React Geocode, чтобы получить долготу и широту. Это работает (они регистрируются на консоли), но, видимо, требуется некоторое время для его работы, поскольку это не значения, отправляемые в базу данных.

Я провел некоторое исследование и думаю, что это может быть потому, что я где-то там нет функции asyn c. Может ли это быть проблемой?

onSubmit={(values, { setSubmitting }) => {

         values.address = `${values.street}, ${values.num}, ${values.neighbourhood}, ${values.city}`

        Geocode.fromAddress(values.address).then(
          response => {
            const { lat, lng } = response.results[0].geometry.location;
            values.latitude = lat.toString() //why doesn't this work?
            values.longitude = lng.toString() //why doesn't this work?
                          console.log(values.latitude) //this will log on the console
                                                       //but won't go to the database
          },
          error => {
            console.error(error);
          }
        );

        const { name, latitude, longitude, rating, address } = values
        const valuesToSend = { name, latitude, longitude, rating, address }

        async function writeToFirebase() {
          await firestore.collection('businessesPendingAdminApproval').add(valuesToSend)
        }

        writeToFirebase()

      }}>

1 Ответ

1 голос
/ 07 мая 2020

Причина, по которой это не работает, заключается в том, что вы изменяете значения внутри .then из Geocode.fromAddress, то есть асинхронного вызова c. И поскольку вы не используете await в вызове, код просто проходит мимо этого и go непосредственно в вызов firebase.

Что вам нужно сделать, это добавить await перед Geocode.fromAddress .

await Geocode.fromAddress(values.address).then(...)
...