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 本身就是一个Promise。 - 不,这将是一个值数组。在此处查看示例
-
那为什么不使用 .then() 就不能访问它的内容呢?
-
查看此在线演示
-
好的,然后还有其他一些我无法诊断的问题,因为在我的情况下,对 promise2.then(console.log.bind(console)); 的最后一次调用记录了 Promise。知道为什么吗?
-
尝试在 promise2.then(console.log.bind(console)); 行之后添加 console.log('processing');。我认为您可能会将 REPL 的输出与 console 的输出混淆。
-
我在浏览器中,我没有 REPL,但无论如何都尝试过,我得到"处理",然后记录了 Promise。
-
您在其中运行代码的 devtools js 控制台是一个 REPL。您使用的是原生 Promises 还是某个库?
-
我尝试了原生Promise和 Ember 的实现(应该与规范兼容),但没有运气。
-
假设 n.get("spotifyData") 是同步的,您能否向我们展示您的 this.findConnections() 方法代码?
-
n.get() 是 Ember 的 get 方法,这是同步的。为 findConnections() 添加的代码
-
您使用的是哪种实现,Promise 是什么,promise1 来自哪里?
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)。
- 您首先添加 promise1 = Promise.resolve(promise1) 是绝对正确的。不过,这很奇怪,因为 promise1 是调用 Ember.$.get() 的结果 jQuery get 不应该返回符合标准的 promise 吗?
-
@ThomasP:jQuery?啊哈哈哈哈。嗯,不,不幸的是,jQuery then 仅适用于 jQuery 自己的Promise。
-
因此,如果您将 Promise.all() 调用package在 $.when(…) 中,它会起作用 :-)
-
是的,但是如果我只用 Ember.RSVP.Promise.resolve() package原始的 $.get(),它看起来也可以工作,这给了我一个符合标准的Promise,以及 jQuery 的简单 AJAX。很遗憾 jQuery 不兼容,但足够好。非常感谢您的时间!