首页 > 解决方案 > 为什么变量未定义

问题描述

我可以从第一个承诺中访问变量“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);
        }
      });
    });
  }

标签: javascriptpromisees6-promise

解决方案


当您需要访问链中的中间值时,您应该将链拆分为您需要的单个部分。与其附加一个回调并以某种方式尝试多次使用其参数,不如将多个回调附加到同一个 Promise - 无论您需要结果值的任何地方。

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


推荐阅读