Javascript - несколько .then-предложений внутри исполнителя обещания - PullRequest
0 голосов
/ 14 января 2020

У меня проблемы с пониманием следующего javascript кода:

/**
* Outputs the result of compiling a template.
*
* @module generator.generate
* @param  {Object}        config Configuration options
* @param  {Object|String} config.asyncapi AsyncAPI JSON or a string pointing to an AsyncAPI file.
* @param  {String}        config.target_dir Path to the directory where the files will be generated.
* @return {Promise}
*/
generator.generate = config => new Promise((resolve, reject) => {
 bundleAndApplyDefaults(config)
   .then((cfg) => {
     async function start () {
       await registerHelpers(cfg);
       await registerPartials(cfg);
       await generateDirectoryStructure(cfg);
     }

     start().then(resolve).catch(reject);
   })
   .catch(reject);
});

Более конкретно, в каком порядке вызываются .then и какому обещанию они принадлежат. Я думаю, что первый .then вызывается, когда метод bundleAndApplyDefaults(config) завершен. Но я не уверен, откуда берется параметр cfg.

Внутри функции start() вызывается и выполняется вторая .then с разрешением исходного обещания, только исходное обещание. поймать (отклонить) за пределами исполнителя и нет .then для успеха, насколько я знаю.

При этом я также не уверен, почему существует .then после метода запуска, когда нет реального обещания .

Я ценю любую помощь.

Ответы [ 3 ]

4 голосов
/ 14 января 2020

Это ужасный код, полный антишаблонов Promise конструктора и , смешивающих синтаксис async / await с then вызовами метода . Это должно быть просто

generator.generate = async (config) => {
  const cfg = await bundleAndApplyDefaults(config);
  await registerHelpers(cfg);
  await registerPartials(cfg);
  await generateDirectoryStructure(cfg);
};
1 голос
/ 14 января 2020

Это плохо написанный код. Вот что хотел написать автор:

generator.generate = config => bundleAndApplyDefaults(config).then(async (cfg) => {
    await registerHelpers(cfg);
    await registerPartials(cfg);
    await generateDirectoryStructure(cfg);
  });

Этот код работает точно так же, как ваш код, без раздувания.

Обтекание new Promise() является антипаттерном и приходит сюда с дополнительные расходы, которые вы должны разрешить / отклонить, перенаправив значения из Обещания, которые возвращает start().

Я также не уверен, почему после метода start есть .then, когда нет фактического обещания.

Функция async возвращает обещание.

0 голосов
/ 14 января 2020

Поскольку start равно async, оно вернет неявное обещание.

Ссылка MDN содержит дополнительную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...