【问题标题】:why the variable is undefined为什么变量未定义
【发布时间】:2018-05-05 00:52:09
【问题描述】:

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

【问题讨论】:

  • 可能不是问题的原因,但我应该指出,第一个 promise 的 'then' 函数没有返回任何内容,因此下一个 'then' 不会收到输入论据
  • @MátéSafranka 但我没有使用数据对象,而且电子贺卡也有价值。
  • 我不知道你在问什么,但也许这会有所帮助:How to chain and share prior results with promises
  • savedCards 应该是未定义的并且eCard.id 应该有一个值是完全合理的。代码中没有可观察到的东西会阻止这两种数据状态中的任何一种。

标签: javascript promise es6-promise


【解决方案1】:

当您需要访问链中的中间值时,您应该将链拆分为您需要的单个部分。与其附加一个回调并以某种方式尝试多次使用其参数,不如将多个回调附加到同一个 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

【讨论】:

  • 变量 savedCards 没有在第一个承诺中声明,仍然可以从它访问,但不能在第二个承诺中访问。
  • @KumaranRajK,因为您分配了savedCards = value.saveCard,而value 没有这样的属性。对savesvalue.saves 进行任何处理都不会改变这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多