为什么可以返回递归的Promise?

时间:2019-08-19 08:07:45

标签: javascript es6-promise

我有以下代码(在此处重构为几乎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的最后一行应该在承诺完成之前立即返回。

我在这里想念什么?

2 个答案:

答案 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(//...