Угловое ожидание обещания решить, прежде чем продолжить - PullRequest
0 голосов
/ 06 июля 2018

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

saveChanges() {
    //blah blah
    if (needTovalidate){
    passedCheck = false;
    this.validationService.checkExistence(value)
    .then((exist: boolean) => {
      passedCheck = exist;
      console.log("INSIDE: " + exist);

    });
    console.log("OUTSIDE: " + passedCheck);

    if(passedCheck) {
        //Rest of code
    } else {
        //Throw error msg
    }
}


public async checkExistence(value: string): Promise<boolean>{
  var exist = false;
  return this.getRefData().then((rec: dataModel[]) => {
    return rec.some(el => {
      return el.col1 === value;
    });
  });
}

private async getRefData() {
  return await this.configurationService.retrieveTableData().toPromise(); 
}

Ожидаемый журнал:

INSIDE: true
OUTSIDE:true

Фактический журнал:

OUTSIDE: false
INSIDE: true

Очевидно, что код не дождался разрешения логического обещания, прежде чем перейти к следующей строке.

Есть предложения?

1 Ответ

0 голосов
/ 06 июля 2018

Как @ jfriend00 упоминает в ваших комментариях о том, что это пара похожих вопросов, всякий раз, когда вы используете асинхронные функции (Promise, Observable), вы должны добавить асинхронность обратно к вызову и .then или * 1004. * это там.

Возвращаемое значение с асинхронными функциями в Typescript

Есть предложения?

Вы можете изменить свои функции saveChanges и checkExistence аналогично следующему:

Пожалуйста, посмотрите пример ниже и, возможно, очистите ваш пример кода вопроса в редактировании (если не переписать, чтобы сделать лучший пример вопроса, я думаю, что вы, по крайней мере, можете решить свою проблему самостоятельно, потратив время снова пройти через это кропотливо)

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

saveChanges(needToValidate: boolean, // ??
  changesToValidate: Changes,
  asyncValidateFunction: (changes: Changes) => Promise < boolean > , // hmm
) {

  asyncValidateFunction(changesToValidate);
  //blah blah
  if (needToValidate) { // Random context here? Feels like too many things going on in one. Try to isolate functionality.
    this.validationService.checkExistence(value)
      .then(
        (exist: boolean) => {
          yourStuffToDoAfterPassedCheckValidation(exist) // hmm
          console.log("INSIDE: " + exist); // be safe and stay inside :)
        }
      );

  }
}

// Tried to encapsulate as much as your original concept and style from original question. 
// Please refactor this based on your understanding
yourStuffToDoAfterPassedCheckValidation(passedCheckFlag: boolean) {
  if (passedCheckFlag) {
    // Rest of code
  } else {
    // Throw error msg
  }
}

public checkExistence(value: string): Promise < boolean > {
  // Unused junk code? var exist = false;

  return this.getRefData()
    .then(
      (rec: dataModel[]) => {
        return rec
          .some(el => {
            return el.col1 === value;
          });
      });
}

Поскольку это в Angular, может ли это быть связано с угловыми формами? Асинхронные валидаторы могут быть вам полезны, даже если они не связаны напрямую

Подобный вопрос к Возвращаемое значение с асинхронными функциями в Typescript и, возможно, многих других Я вижу подобные несоответствия в этих типах вопросов, которые можно исправить с помощью явного ввода в TypeScript, чтобы обеспечить более быструю обратную связь о вещах, чтобы защититься от неправильных действий!

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

В противном случае мы могли бы работать с псевдокодом с большей ясностью. Поскольку этот вопрос кажется дублирующим и допускает похожие асинхронные ошибки, вы должны указать контекст, в котором ваш код не работает, в противном случае исчерпывающие ответы уже доступны в других вопросах ?.

При устранении неполадок в запутанном коде это может помочь вам сначала переписать весь программный поток в виде псевдокода, а затем сгенерировать код, основанный на этом, чтобы объединить то, что вы пытаетесь понять. (Вот почему я иногда рекомендую написать от руки вашу программу или, по крайней мере, разбить все на назначенные переменные, явно ввести все и максимально использовать языковую службу TypeScript, насколько это возможно.

Редактировать: Я вижу, вы уже уже продублировали свой собственный вопрос, который немного яснее и работает над решением ваших проблем. Хотелось бы, чтобы вы только что обновили свой вопрос в одном месте. Из комментариев на ваши другие вопросы вы, похоже, не хотите следовать предложениям по фундаментальному асинхронному использованию Promise и все еще хотите зависеть от измененного значения, которое еще не существует (асинхронно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...