我现在正在寻找一个名称指定为参数的文档路径。在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
}
}
}
}
答案 0 :(得分:2)
当您处理回调时,您无法真正同步处理事情。我没有直截了当的答案(因为你的代码并不简单),但我建议如下:
学习承诺。如果您正在使用Node.js版本6及更高版本,那么它们就是内置的。它们并不完全同步,但您可以这样对待它们。如果您使用的是版本8,那么它们就是async/await
的网关
您编写的代码需要在完成所有回调后执行某些操作。使用您的模式,可以通过传递callback
函数并将此函数作为链中的最后一个级别来完成。