db.find可以正常工作,但是非常慢。因此,我尝试将db.search与搜索索引一起使用,但它限制为200条记录。因此,我随后通过使用内存不足的嵌套承诺来调用相同的搜索以遍历所有书签。下面的代码有什么问题吗?
let qOptions;
qOptions = {'include_docs': true, limit: 200}
qOptions.q = "name: 'BEN'";
let allDocuments = [];
this.getAllDocuments(qOptions, allDocuments, 'app', 'myIndex')
.catch(err => {
....
})
.then((result) => {
....
});
,然后是经常性承诺:
getAllDocuments(queryOpqOptionstions, allDocuments, designName, indexName) {
const promise = new Promise((resolve, reject) => {
dbConnection.search(designName, indexName, qOptions, (err, result) => {
if (!err) {
if (result.rows.length === 0) {
resolve(allDocuments)
} else {
qOptions.bookmark = result.bookmark;
result.rows.forEach((result) => {
allDocuments.push(result)
})
this.getAllDocuments(qOptions, allDocuments, designName, indexName).then((docs) => {
resolve(docs);
}).catch((error) => {
logger.error({err: error});
reject(error);
})
}
} else {
logger.error({err: err});
reject(err);
}
})
})
return promise;
}
答案 0 :(得分:0)
您不应通过解析传递文档。
注意getAllDocuments(queryOpqOptionstions...
queryOpqOptionstions 听起来很奇怪
您最好使用Array.concat
代替forEach...push
将所有文档初始化为成员变量
this.allDocuments=[]
this.getAllDocuments(qOptions, 'app', 'myIndex')
.catch(err => {
....
})
.then((result) => {
....
});
...
getAllDocuments(qOptions, designName, indexName) {
const promise = new Promise((resolve, reject) => {
dbConnection.search(designName, indexName, qOptions, (err, result) => {
if (!err) {
if (result.rows.length === 0) {
resolve()
} else {
qOptions.bookmark = result.bookmark;
this.allDocuments = this.allDocuments.concat(result.rows)
this.getAllDocuments(qOptions).then((docs) => {
resolve();
}).catch((error) => {
logger.error({err: error});
reject(error);
})
}
} else {
logger.error({err: err});
reject(err);
}
})
})
return promise;
}