Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对nodejs中异步函数的递归调用_Javascript_Node.js_Asynchronous_Recursion - Fatal编程技术网

Javascript 对nodejs中异步函数的递归调用

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

我执行一个异步搜索调用。搜索结果不会一次性返回。我一次最多得到200个结果。对于下一组结果,我必须从第一组结果中提取书签。因此,查询应该按顺序进行。我已经写了以下代码,但它不工作。下一个循环(for循环)在没有完成第一个查询的情况下执行。我不知道如何解决这个问题

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;