【问题标题】:Promise of promise to simple promise?承诺的承诺到简单的承诺?
【发布时间】:2015-10-06 06:11:52
【问题描述】:

我一直在玩 promise,通常可以弄清楚如何很好地处理它们,但在这种情况下,我不知道如何删除一个 promise-wrapping 级别。

代码如下:

let promise2 = promise1.then((nodes) => {
  return Promise.all(nodes.map(n => {

    // findConnections returns a promise
    return this.findConnections(n.get("spotifyData")); 
  }));
});

现在我希望promise2 包装一个数组,但它没有,它包装了一个包装数组的promise。如果我想访问数组,我必须这样做:

promise2.then(level1 => level1.then(level2 => console.log(level2)));

level1 本身就是一个承诺。

当然,我可以使用它,但是我发现代码非常丑陋,我想简化它以便您可以这样做:

promise2.then(level1 => console.log(level1))

并直接在那里得到一个数组。

有什么想法吗?

谢谢!

编辑:

findConnections() 方法:

findConnections: function (node) {
  return Ember.$.get("https://api.spotify.com/v1/artists/" + node.id + "/related-artists").then((data) => {
     return data.artists;
  });
}

【问题讨论】:

  • level1 本身就是一个承诺。 - 不,它是一个值数组。检查示例here
  • 那为什么不使用 .then() 就不能访问它的内容呢?
  • 查看online demo
  • 好的,那么还有其他一些我无法诊断的问题,因为在我的情况下,最后一次调用 promise2.then(console.log.bind(console)); 记录了 Promise。知道为什么吗?
  • 尝试在promise2.then(console.log.bind(console)); 行之后添加console.log('processing');。我认为您可能会将 REPL 的输出与 console 的输出混淆。

标签: javascript promise


【解决方案1】:

level1 本身就是一个承诺。

不,不是。 Ember 确实使用了RSVP,即Promises/A+ compatible,这意味着then 回调永远不会用promise(或thenable)调用。他们总是收到一个简单的值。

Promises/A+ 确实要求没有从 then 返回的嵌套承诺。它们总是递归地展开。你可以这样做

promise2.then(connections => console.log(connections));

如果这真的不起作用,那表明promise1 不是真正的(或至少不是符合标准的)承诺,你应该先做promise1 = Promise.resolve(promise1)

【讨论】:

  • 首先添加promise1 = Promise.resolve(promise1) 是绝对正确的。不过,这很奇怪,因为 promise1 是调用 Ember.$.get() 的结果,难道 jQuery 不应该返回符合标准的承诺吗?
  • @ThomasP:jQuery?啊哈哈哈哈。嗯,no, unfortunately not,jQuery then 只适用于 jQuery 自己的 Promise。
  • 因此,如果您将 Promise.all() 调用包装在 $.when(…) 中,它会起作用 :-)
  • 是的,但是如果我只用 Ember.RSVP.Promise.resolve() 包装原始的 $.get(),它看起来也可以工作,这给了我一个符合标准的承诺,而且很容易jQuery 的 AJAX。很遗憾 jQuery 不兼容,但足够好。非常感谢您的宝贵时间!
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 2016-08-19
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多