请求中递归函数调用的异步问题
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
函数并将此函数作为链中的最后一级调用来完成的。
我现在正在寻找一个将其名称指定为参数的文档路径。在 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
函数并将此函数作为链中的最后一级调用来完成的。