Асинхронная функция с 2 ожиданиями должна быть приостановлена и перенаправлена после использования обеих функций ожидания

#javascript #forms #axios #fetch

Вопрос:

Я использую форму, а затем данные отправляются в 2 базы данных. одна из них использует внешний API третьей части (evento), к которому я обращаюсь из своего внутреннего API (/api/v1/eticket/посетитель), а другая-в мою собственную базу данных mongo с использованием внутреннего API (/api/v1/пользователи/обновление).

Вот код на интерфейсе, который запускает форму submit

 
// UPDATE SETTINGS
const saveSettings = document.querySelector(".form-user-data");

if (saveSettings) {
  saveSettings.addEventListener("submit", async (e) => {
    e.preventDefault();
    const firstName = document.getElementById("firstName").value;
    const lastName = document.getElementById("lastName").value;
    const mobile = document.getElementById("mobile").value;
    const email = document.getElementById("email").value;
    const company = document.getElementById("company").value;
    const profile = document.getElementById("profile").value;
    const country = document.getElementById("country").value;
    const nationality = document.getElementById("nationality").value;
    const type = document.getElementById("type").value;
    const visitorId = document.getElementById("visitorId").value;

    const visitorForEvento = {
      VisitorNumber: visitorId,
      FirstName: firstName,
      LastName: lastName,
      Mobile: mobile,
      Email: email,
      Company: company,
      JobTitle: profile,
      Country: country,
      Nationality: nationality,
      Category: type,
    };

    // UPDATE EVENTO DATABASE
    await updateEvento(visitorForEvento, "evento");

    // UPDATE MONGODB
    await updateSettings(
      {
        firstName,
        lastName,
        mobile,
        email,
        company,
        profile,
        // address,
        // city,
        country,
        nationality,
        type,
      },
      "data"
    );

    alert(
      "This function should halt here and pause and then redirect to another view"
    );
  });
}


 

А вот 2 функции, которые обновляют свои собственные базы данных. Я хотел быть последовательным и использовать только fetch для обоих, но по какой-то причине это не сработало бы с fetch, но работало с axios .. и именно поэтому я использую 2 разных метода запроса ниже…

 const fetch = require("node-fetch");
import axios from "axios";

export const updateEvento = async function(data, type) {
  try {
    const url = "/api/v1/eticket/visitor";

    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(data),
    });
    const res = await response.json();

    if (res.status === "success") {
      console.log(`${type.toUpperCase()} Updated`);
    }
  } catch (err) {
    alert(err.response.data.message);
  }
};

export const updateSettings = async function(data, type) {
  try {
    const url =
      type === "password"
        ? "/api/v1/users/updateMyPassword"
        : "/api/v1/users/updateMe";

    const res = await axios({
      method: "PATCH",
      url,
      data,
    });

    if (res.data.status === "success") {
      console.log(`${type.toUpperCase()} Updated`);
    }
  } catch (err) {
    alert(err.response.data.message);
  }
};



 

Теперь в функции, назначенной для «Настроек сохранения» submit , происходят 3 вещи..

updateEvento() updateMongo()

а затем я хочу, чтобы поток остановился здесь и перенаправил на другую страницу, посвященную успеху…

Однако я добавил функцию оповещения, но по какой-то причине функция продолжает двигаться вперед и не останавливается на достигнутом.. Остальные 2 функции успешно завершаются .. данные удаляются.. однако я нигде не могу сделать паузу, и особенно в конце успешного завершения обеих функций я хотел бы приостановить и перенаправить. Но я, кажется, не могу этого сделать.

Что я делаю не так?

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

1. Пауза в ожидании чего? Или как долго?

2. В принципе, я хотел бы иметь этот код window.setTimeout(() => location.assign("/"), 3000); после alert , но пока я не могу даже показать alert

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

4. Изменил alert на console.log , но по — прежнему никаких изменений.. существует console.log' in 2 other functions функция updateEvento` и updateSettings , но функция, похоже, просто показывает первый вход updateEvento и выход, а тот, от updateSettings которого, даже не появляется, и последний в функции, назначенной submit событию, тоже не отображается

5. возможно ли, что функция e.preventdefault() не работает? В любом случае, чтобы проверить это?

Ответ №1:

Я понял свою ошибку, и в случае, если кто-то еще столкнется с той же проблемой, пожалуйста, дважды проверьте действие, примененное к вашей кнопке!

Я назначил функцию отправки в форму. И у кнопки был класс «обновление данных» .. но в следующий раз я буду осторожен, чтобы иметь такое общее название для кнопки.. У меня была в какой-то другой форме кнопка с аналогичным именем, и я применил функцию для события «щелчок», и эта функция включалась, когда я отправлял свою форму.

Я потерял 2 дня своей жизни.. Я надеюсь, что это поможет кому-то еще спасти их.