在请求中使用递归函数调用的异步问题

时间:2017-08-31 23:06:33

标签: javascript node.js recursion dialogflow actions-on-google

我现在正在寻找一个名称指定为参数的文档路径。在fetch_doc_path中,我发出两个get请求来获取一个包含所有文件条目的JSON文件,然后递归调用traverse_doc以找到与名称匹配的文件路径作为用户输入。现在的问题是,当我检查fetch_doc_path中的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
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

当您处理回调时,您无法真正同步处理事情。我没有直截了当的答案(因为你的代码并不简单),但我建议如下:

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

  • 您编写的代码需要在完成所有回调后执行某些操作。使用您的模式,可以通过传递callback函数并将此函数作为链中的最后一个级别来完成。