【问题标题】:ES6 - Confused about processing order of PromiseES6 - 对 Promise 的处理顺序感到困惑
【发布时间】:2015-09-17 21:29:18
【问题描述】:

我有这个代码:

let p1 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve({dogs: ['Fido', 'Spot']});
    }, 2000);
});

p1.then(function (val) {
    console.log('first then');
    console.dir(val);
    return _.extend(val, {cats: ['Fluffy', 'Whiskers']});
}).then(function (val) {
    console.log('second then');
    console.dir(val);
});

意外的控制台输出显示:

我不明白cats 在实际附加到对象之前如何可能成为值的一部分。不过,第二个then 中打印的结果对我来说很有意义。我错过了什么吗?

【问题讨论】:

  • 查看控制台中的i 弹出窗口。你看到的是后来变异的对象。
  • 它说“下面的对象状态在第一次扩展时被捕获。”我什至不知道这意味着什么......
  • 是 underscore.js 的 _.extend() 吗?

标签: ecmascript-6 es6-promise


【解决方案1】:

您正在将cats 属性添加到您已记录的同一对象中。

正如i 图标告诉您的那样,控制台只会在您实际展开对象时读取对象的属性。

【讨论】:

  • 因为序列化东西很慢。如果您经常记录一个非常大的对象,它会使您的标签陷入停顿。另外,并非所有对象都可以轻松复制,因此即使只是制作副本也没有明确定义。如果您当时想要它,只需执行console.log(JSON.stringify(obj, null, 2));,或执行_.extend({}, val, {cats: ['Fluffy', 'Whiskers']});,这样您就不会改变原始值。
  • @loganfsmyth 我同意 JSON.stringify 是一种可能的解决方法。
  • @loganfsmyth:请不要忘记投票关闭为重复 :-)
【解决方案2】:

据我所知,ES6 Promises 在 console.log 中有一个错误。它会在记录对象的值之前等待几秒钟,这就是它包含猫的原因。如果我没记错的话,这个错误发生在 Firefox 中。我不知道其他浏览器的表现如何。

【讨论】:

  • 只是console.log。如果我执行alert,它会按预期工作。这个控制台问题在 FF 和 Chrome 中都会出现。
  • @ffxsam 耶普。这是一个已知的错误。我认为你不需要报告它,如果你找到现有的报告,也许可以在某处添加 +1。
  • 这不是错误,而是一项功能。
  • @loganfsmyth 我们都知道:bug + won'tfix = feature.
  • 我的意思是真的。请参阅我的其他评论。有时这可能有点令人惊讶,但实际上没有任何方法可以对一个对象进行深入的反省,而不是像现在这样。
猜你喜欢
  • 2021-10-22
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多