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

asynchronous issue with recursive function call inside a request

我现在正在寻找一个将其名称指定为参数的文档路径。在 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
            }
        }
    }
}

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

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

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