我有以下代码(在此处重构为几乎1:1的代码):
首先,要了解content <- read_pptx(fileName)
data <- pptx_summary(content)
实际上是对构造函数对象的调用,我们在其中生成bridge_component_start_test
的初始诺言,我试图在此处对此加以模仿。这是我进行AJAX调用的工厂,因此,每个对象都创建一个Promise,该Promise进行调用,然后使用从服务器接收到的JSON解析/拒绝。我也在下面的解析中模拟了该响应。
return new Promise..
function recursive_function(data) {
let local_data = $.extend({}, data);
return new Promise((resolve, reject) => {
//The offset gets
local_data.bridge_process_batch_offset++;
if (local_data.bridge_process_batch_offset == 3) {
resolve({
'data': {
'response_data': {
'done_batching': true
}
},
'success': true
})
} else {
resolve({
'data': {
'response_data': {
'done_batching': false,
'bridge_process_batch_offset': local_data.bridge_process_batch_offset
}
},
'success': true
})
}
//For now, no reject.
});
}
function do_the_main_thing(data) {
/**
* Make a local copy of the passed data.
*/
let request_data = $.extend({}, data);
let bridging_data = {
'just_installed_component_demo': request_data.just_installed_component_demo,
'just_installed_component_name': request_data.just_installed_component_name,
'just_installed_component_category': request_data.just_installed_component_category,
'bridge_process_batch_offset': 0
};
const recursively_do_things = () => recursive_function(bridging_data).then(response => {
if (response.data.response_data.done_batching) {
return (response);
} else if (response.data.success == false) {
return response;
} else {
console.log('Went through step ' + response.data.response_data.bridge_process_batch_offset + '!');
if ('bridge_process_batch_offset' in response.data.response_data) {
bridging_data.bridge_process_batch_offset = response.data.response_data.bridge_process_batch_offset;
}
return recursively_do_things ();
}
}).catch(error => {
return error;
});
return recursively_do_things();
}
do_the_main_thing({
'just_installed_component_demo': 'demo-2',
'just_installed_component_name': 'demo-2_post',
'just_installed_component_category': 'post',
'bridge_process_batch_offset': 0
}).then(response => {
console.log('...and now I am done!');
});
但是请注意,在我的<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
中,我只是从那个承诺递归中返回do_the_main_thing
。是的,当然,我也是response
,但是JS如何知道从该递归功能中返回一个Promise?
退货就是退货。它不必等待Promise完成,但是看起来确实如此。从理论上讲,我的return recursively_bridge_component_start
的最后一行应该在承诺完成之前立即返回。
我在这里想念什么?
答案 0 :(得分:0)
您不只是从response
返回recursively_do_things
如果查看该函数,则返回的是链的一部分,您的return response
只是promise链的一部分。
所以这部分
const recursively_do_things= () => recursive_function(bridging_data).then(response => /* omitted */ );
正在向您返回一个承诺链,表示它首先等待recursive_function
完成,then
进行内部响应,之后您可以链接其他语句
因此,由于您要从return recursively_do_things()
返回do_the_main_thing(data)
,因此很明显将返回承诺。
承诺本身就是承诺的感知,这意味着,如果您在链中返回承诺,则承诺链将等待返回的承诺完成,然后再继续链的下一部分。
对此的要求是您需要返回它,如果您仅调用一个返回promise的函数,它将不会等待它。
答案 1 :(得分:0)
但这很简单。 bridge_component_start_in_test(data)
的返回值就是recursively_bridge_component_start()
的返回值。
该函数依次返回bridge_component_start_test(data).then(/* do stuff */).catch(/* do other stuff */)
。无论“做某事”和“做其他事情”的细节如何,这始终是一个诺言。
bridge_component_start_test
显式地返回一个承诺:return new Promise(//...