Javascript 对nodejs中异步函数的递归调用
我执行一个异步搜索调用。搜索结果不会一次性返回。我一次最多得到200个结果。对于下一组结果,我必须从第一组结果中提取书签。因此,查询应该按顺序进行。我已经写了以下代码,但它不工作。下一个循环(for循环)在没有完成第一个查询的情况下执行。我不知道如何解决这个问题Javascript 对nodejs中异步函数的递归调用,javascript,node.js,asynchronous,recursion,Javascript,Node.js,Asynchronous,Recursion,我执行一个异步搜索调用。搜索结果不会一次性返回。我一次最多得到200个结果。对于下一组结果,我必须从第一组结果中提取书签。因此,查询应该按顺序进行。我已经写了以下代码,但它不工作。下一个循环(for循环)在没有完成第一个查询的情况下执行。我不知道如何解决这个问题 var getQueryResult = function(resourcetypeStr, startTime, endTime, bookmark){ var promise = new Promise(function(reso
var getQueryResult = function(resourcetypeStr, startTime, endTime, bookmark){
var promise = new Promise(function(resolve, reject) {
var options = {
OPTIONS
};
search(DESIGN_DOC, INDEX, options) //Async function
.then(function (data) {
resolve(data);
})
.catch(function(error){
logger.error("Error querying database " + resourcetypeStr + ": " + error);
return reject(error);
});
});
return promise;
};
var getRemainingData = function(resourcetypeStr, startTime, endTime, bookmark, number){
var promise = new Promise(function(resolve, reject){
var result;
for(i = 0; i<number; i++ ){
var data = getQueryResult(resourcetypeStr, startTime, endTime, bookmark).then (function(data){
if(result){
result = result.concat(data);
}else{
result = data;
}
if(data.row.lenth ===0){
resolve(result);
}
bookmark = data.bookmark;
return data;
});
}
});
return promise;
};
var getResources = function (resourcetypeStr, list, startTime, endTime) {
var promise = new Promise(function(resolve, reject) {
var options = {
OPTIONS
};
return search(DESIGN_DOC, INDEX, options)//Async function
.then(function (data){
if(data.total_rows > 200){
debugger;
getRemainingData(resourcetypeStr, startTime, endTime, data.bookmark, function(result){
resolve(data.concat(result));
});
}else{
resolve(data);
}
})
.catch(function(error){
console.log("reject error :"+error);
return reject(error);
});
});
return promise;
};
使用回调,但这是溢出堆栈。我不知道为什么在我的测试用例中只有300个结果,所以它应该只在这里运行一次
var promise = new Promise(function(resolve, reject){
var result,
callback = function callback(data) {
if (result) {
result = result.concat(data);
} else {
result = data;
}
if (data.row.length ===0) {
resolve(result);
}
else {
getQueryResult(resourcetypeStr, startTime, endTime, bookmark).then(callback);
}
};
getQueryResult(resourcetypeStr, startTime, endTime, bookmark).then(callback);
});
return promise;
当getQueryResult返回时,如果长度为0,则我们完成并可以解析外部承诺,否则使用相同的回调再次调用getQueryResult,直到长度为0。因此,如果需要,让每个解析getQueryResult调用下一个,而不是for循环
如果这与您的第二次尝试类似,请检查data.row.length的值,因为只有data.row.length从不为0时,该值才能无限大。
var data=getQueryResult(resourcetypeStr、startTime、endTime、bookmark)。那么()
这不是每次都会覆盖外部数据变量吗?我有一种预感,你的承诺每次都被垃圾收集,因为你用下一个承诺覆盖了每一个承诺。尝试使用Promise.all()
来实现这一点,这样可以省去你自己的麻烦。:)问题是for循环在搜索数据返回之前进行。下一个书签应该来自第一次搜索的数据。谢谢。这与我的第二次尝试相似。我的代码还有其他一些问题,所以第二种方法不起作用。
var promise = new Promise(function(resolve, reject){
var result,
callback = function callback(data) {
if (result) {
result = result.concat(data);
} else {
result = data;
}
if (data.row.length ===0) {
resolve(result);
}
else {
getQueryResult(resourcetypeStr, startTime, endTime, bookmark).then(callback);
}
};
getQueryResult(resourcetypeStr, startTime, endTime, bookmark).then(callback);
});
return promise;