我一直在玩承诺,通常可以弄清楚如何处理它们,但在这种情况下,我无法弄清楚如何删除一个承诺包装级别。
以下是代码:
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;
});
}
答案 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)
。