Я хочу создать локальное хранилище внутри .subscribe, но оно создает локальное хранилище после всех функций - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь проверить форму, если пользователь существует в базе данных MySQL с angular. Я создаю элемент localalstorage внутри .subscribe, поэтому, если пользователь существует, он создает localalstorage, как это:

localStorage.setItem("exist","true"); 

, но если он не существует, это делает:

localStorage.setItem("exist","false");

После функции я проверяю, является ли она истинной или ложной, но она равна нулю, потому что .subscribe делает это после всех функций. Поэтому, если я проверяю второй раз, он правильно делает элемент localalstorage.

this.userService.getAutor(id)
  .subscribe(
    (data) => { // Successins
      localStorage.setItem("exist","true");
    },
    (error) => { // error
      localStorage.setItem("exist","false");
    }
  );
}

Здесь я вызываю функцию

  this.usuarioExiste(this.dniAutor);

      if(localStorage.getItem('existe') == 'false'){
        var expReg = /^(\d{8})([A-Z])$/;

        if(expReg.test(this.dniAutor)){

          this.userService.crearAutor(JSONform)
          .subscribe(

            (data) => { // Success
              console.log("¡Bien HECHO!");
            }
          );
          alert("Autor añadido correctamente");
        }
else{
  alert("Dni mal introducido")
}

Ответы [ 3 ]

1 голос
/ 09 марта 2020

После функции я проверяю, является ли она истинной или ложной, но она равна нулю

Неправильный путь

this.userService.getAutor(id)
  .subscribe(
    (data) => { // Successins
      localStorage.setItem('existe',"true"); // <-- called after functionCheckIfTrueOrFalse, NO DATA in storage yet
    },
    (error) => { // error
      localStorage.setItem('existe',"false"); // <-- called after functionCheckIfTrueOrFalse, NO DATA in storage yet
    }
  );
}
functionCheckIfTrueOrFalse() // <- is called before any localStorage.setItem()

Правильный путь

this.userService.getAutor(id)
  .subscribe(
    (data) => { // Successins
      localStorage.setItem('existe',"true");
      functionCheckIfTrueOrFalse() // <- localStorage HAS the data
    },
    (error) => { // error
      localStorage.setItem('existe',"false");
      functionCheckIfTrueOrFalse() // <- localStorage HAS the data
    }
  );
}

Знание

Если вы хотите потратить время и понять, как это работает под капотом, вы можете проверить эту статью .

В двух словах JavaScript обрабатывает asyn c поступает по-разному:

enter image description here

Вы получаете null, потому что вы читаете данные из syn c Очередь прежде чем вы получите данные из Asyn c протектора.

0 голосов
/ 09 марта 2020

Наконец-то это сработало!

Я использовал предложение 0leg, и оно сработало!

this.userService.getAutor(id).subscribe(data => {
      if (data) {
        localStorage.setItem('existe', 'true');
      } else {
        localStorage.setItem('existe', 'false');
      }
    });

Many thanks to all!

Have a nice day!
0 голосов
/ 09 марта 2020

Как упоминал Курт, мой ответ нуждается в объяснении.

Поэтому я приложу все усилия ниже:

Сначала вы должны проверить, доступны ли данные, когда вы подписываетесь Метод из-за асинхронного характера вызова. И только после этого вы получаете доступ к локальному хранилищу в соответствии с вашими намерениями.

Примечание. Вы также можете использовать оператор фильтра, например, так filter(data => data), чтобы пропустить условие if, но только если вы не заинтересованы в доступе к локальному хранилищу. если данные не существуют.

 this.userService.getAutor(id).subscribe(data => {
      if (data) {
        localStorage.setItem('existe', 'true');
      } else {
        localStorage.setItem('existe', 'false');
      }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...