Javascript 请求内部递归函数调用的异步问题

Javascript 请求内部递归函数调用的异步问题,javascript,node.js,recursion,dialogflow-es,actions-on-google,Javascript,Node.js,Recursion,Dialogflow Es,Actions On Google,我现在正在寻找一个名为参数的文档路径。在fetch_doc_path中,我发出了两个get请求,以获取一个JSON文件,该文件包含所有文件的条目,然后递归调用traverse_doc以查找与名称匹配的文件路径作为用户输入。现在的问题是,当我在fetch_doc_路径中检查traverse_doc_obj.doc_list.length时,它始终为0,因为traverse_doc尚未完成。如何修改代码,以便在所有递归调用完成后执行检查长度?也就是说,使get请求和递归同步 最简单的例子如下,我想在

我现在正在寻找一个名为参数的文档路径。在fetch_doc_path中,我发出了两个get请求,以获取一个JSON文件,该文件包含所有文件的条目,然后递归调用traverse_doc以查找与名称匹配的文件路径作为用户输入。现在的问题是,当我在fetch_doc_路径中检查traverse_doc_obj.doc_list.length时,它始终为0,因为traverse_doc尚未完成。如何修改代码,以便在所有递归调用完成后执行检查长度?也就是说,使get请求和递归同步

最简单的例子如下,我想在所有递归完成后检查traverse_doc_obj中的列表:

function fetch_doc_path(assistant){
    let doc_name_input = assistant.getArgument('DocName');
    ...
    get_request_handler(assistant, repo_url, function(callback){
        ...
        get_request_handler(assistant, target_repo_url, function(callback){
            traverse_doc(assistant, callback, traverse_doc_obj);
        });
    });
    // Check the list from traverse_doc_obj
}

function traverse_doc(assistant, input_callback, traverse_doc_obj){
    let input_json = JSON.parse(input_callback);
    for (let i = 0; i < Object.keys(input_json['data']).length; i++){
        if (the folder has children){
            ...
            get_request_handler(assistant, sub_dir_url, function(callback){
                // call it self for traversing.
            });
        }else{
               // push path to a list in traverse_doc_obj if name matches doc_name_input
            }
        }
    }
}
函数获取文档路径(助手){
让doc_name_input=assistant.getArgument('DocName');
...
获取请求处理程序(助手、回复url、函数(回调){
...
获取请求处理程序(助手、目标回复url、函数(回调){
遍历文档(助手、回调、遍历文档对象);
});
});
//检查traverse_doc_obj中的列表
}
函数遍历文档(助手、输入回调、遍历文档对象){
让input_json=json.parse(input_回调);
for(设i=0;i
在处理回调时,您无法真正同步地执行操作。我没有一个直截了当的答案(因为您的代码并不直截了当),但我建议如下:

  • 学习承诺。如果您使用的是Node.js版本6及更高版本,那么它们是内置的。它们不是完全同步的,但你可以这样对待它们。如果您使用的是版本8,则它们是
    async/await

  • 正如您所编写的代码一样,它需要一种在所有回调完成后执行某些操作的方法。在您的模式中,这是通过传递
    回调
    函数并调用此函数作为链中的最后一级来完成的


在处理回调时,您无法真正同步地执行操作。我没有一个直截了当的答案(因为您的代码并不直截了当),但我建议如下:

  • 学习承诺。如果您使用的是Node.js版本6及更高版本,那么它们是内置的。它们不是完全同步的,但你可以这样对待它们。如果您使用的是版本8,则它们是
    async/await

  • 正如您所编写的代码一样,它需要一种在所有回调完成后执行某些操作的方法。在您的模式中,这是通过传递
    回调
    函数并调用此函数作为链中的最后一级来完成的


能否将此代码简化为您的问题的最小示例?您的代码伤害了我的眼睛。已编辑@lilezek@Darkrum很抱歉我假设
function(callback){
应该是
function(response){
?你的get\u请求处理程序的工作方式似乎有点奇怪。你能把这段代码简化为你的问题的一个小例子吗?你的代码伤了我的眼睛@lilezek@Darkrum对不起,简化了问题。我假设
函数(callback){
应该是
函数(response){
?get_request_处理程序的工作方式似乎有点奇怪。这是一个很好的建议,我想补充一点,即使你不了解承诺,如果你看看Node.js如何使用异步函数进行回调(几乎无处不在)您会注意到,标准是传递回调函数,该函数将接收作为第一个参数出现的任何错误,并将异步操作的结果作为第二个参数。
someAsyncOperation(选项,函数(错误,结果){…})
尝试按照这种方式编写代码,以减少麻烦。但是学习承诺(最终是生成器或异步/等待)这将对你有很大的帮助。谢谢@capture。我会看看承诺。这是一个很好的建议,如果你看看Node.js如何使用异步函数进行回调(几乎无处不在),我只想补充一点,即使你不了解承诺您会注意到,标准是传递回调函数,该函数将接收作为第一个参数出现的任何错误,并将异步操作的结果作为第二个参数。
someAsyncOperation(选项,函数(错误,结果){…})
尝试按照这种方式编写代码,以减少麻烦。但是了解承诺(以及最终的生成器或异步/等待)将对您大有帮助。谢谢@capture。我们将看看承诺。