关于 javascript:Promise of Promise 到 Simple Promise?

Promise of promise to simple promise?

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

代码如下:

1
2
3
4
5
6
7
let promise2 = promise1.then((nodes) => {
  return Promise.all(nodes.map(n => {

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

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

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

level1 本身就是一个Promise。

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

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

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

有什么想法吗?

谢谢!

编辑:

findConnections() 方法:

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


level1 is a promise itself.

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

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

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

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