为什么变量未定义

时间:2018-05-04 15:56:10

标签: javascript promise es6-promise

我可以访问变量' savedCards'从第一个承诺,它有一些价值。在第二个承诺中,它是未定义的,但是变量' 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 :(得分:0)

当您需要访问链中的中间值时,您应该将链条拆分成您需要的那些单件。而不是附加一个回调并以某种方式尝试多次使用其参数,将多个回调附加到同一个承诺 - 无论您需要结果值的哪个位置。

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关键字中分解执行。这些切片可以相互独立地运行,甚至是异步运行 - 而这正是我们在运行下一步之前等待promise解析时所做的事情。

您的代码正在解决第一个承诺之前的第二个承诺。您无法通过使用“then()”确保您的代码可以按您的方式工作。如果你想要一个同步分辨率,你应该采取另一种方式。

[编辑2]

尝试使用等待并查看您是否能够解决问题。更多信息:http://2ality.com/2017/08/promise-callback-data-flow.html