承诺承诺简单承诺?

时间:2015-07-16 16:58:54

标签: javascript promise

我一直在玩承诺,通常可以弄清楚如何处理它们,但在这种情况下,我无法弄清楚如何删除一个承诺包装级别。

以下是代码:

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

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

现在我希望promise2包装一个数组,但事实并非如此,它包装了一个包装数组的承诺。如果我想访问数组,我必须这样做:

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;
  });
}

1 个答案:

答案 0 :(得分:1)

  

level1是一个承诺本身。

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

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

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

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