почему переменная не определена - PullRequest
0 голосов
/ 04 мая 2018

Я мог получить доступ к переменной «сохраненные карты» из первого обещания, оно имеет какое-то значение. Во втором обещании оно не определено, но переменная 'eCard' имеет значение. Пожалуйста, объясните мне, почему?

  saveCard(eCard: IEcards) {
   var savedCards: IEcards[] = [];
    this.storage.get("key").then((value) => {
      if (value.saves == undefined) {
        var saves = savedCards;
        value.saves = saves;
      }
      savedCards = value.saveCard; // have value and can be accessed
      console.log(savedCards);
    }).then((data) => {
    console.log(savedCards); // savedCards is undefined but eCard.id has value
      this.globalProvider.IsCardExist(eCard.id, savedCards).then((data) => {
        if (!data.response) {
          this.globalProvider.AddEcardToStorage("saves", eCard);
        }
      });
    });
  }

1 Ответ

0 голосов
/ 04 мая 2018

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

function getExample() {
    var a = promiseA(…);
    var b = a.then(function(resultA) {
        // some processing
        return promiseB(…);
    });
    return Promise.all([a, b]).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

[Изменить]

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

Ваш код разрешает второе обещание перед первым. Вы не можете гарантировать, что ваш код будет работать так, как вы хотите, используя "then ()". Если вам нужно синхронное разрешение, вам следует пойти другим путем.

[Редактировать 2]

Попробуйте использовать await и посмотрите, сможете ли вы решить вашу проблему. Более подробная информация здесь: http://2ality.com/2017/08/promise-callback-data-flow.html

...