【发布时间】:2016-10-20 08:47:40
【问题描述】:
我正在尝试遍历 ElasticSearch 的结果并通过替换数组中的项目来修改原始对象。我快完成了,但是 Promise 被解决了不止一次,让我没有可用的结果。
我正在使用source.included = Array.map() 将原始数组替换为函数调用的结果,它几乎可以正常工作。保持对象的原始结构和included 数组中的顺序很重要,这就是我决定尝试这种方法的原因。我试图将自己定位在this example,但 Promise.all() 不知何故无法解决这些承诺。有什么想法吗?
let source = {
title: '1',
included: [{
_id: 'new',
_type: 'mytype'
}]
}
function recursiveGet (source) {
return new Promise((resolve, reject) => {
client.mget({
body: {
docs: docsToFetch
}
})
.then(response => {
return source.included.map(item => {
return somethingAsync(response)
})
})
.then(promises => {
Promise.all(promises)
.then(resolved => {
source.included = resolved.map(doc => {
if (doc.included && !doc.resolved) {
resolve(recursiveGet(doc))
} else {
resolve(doc)
}
})
})
})
})
}
recursiveGet(source)
【问题讨论】:
-
“但 Promise 不止一次解决” 不,不是。根据定义,Promise 只会被解决(技术上,解决)一次。
-
我只在 Angular 中使用 $q 完成了此操作。诀窍是将延迟对象(承诺)传递给您的递归函数。
-
请提供准确的输入、所需的输出和具体问题。
-
“但是 Promise.all() 无法解决承诺。” 你是什么意思?你不是
returnPromise.all()从上次.then()吗?
标签: javascript node.js recursion promise