【问题标题】:Javascript - multiple .then-clauses inside the executer of promiseJavascript - 承诺执行者内的多个 .then-clauses
【发布时间】:2020-05-01 02:24:07
【问题描述】:

我无法理解以下 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 的调用顺序以及它们属于什么承诺。我认为当方法bundleAndApplyDefaults(config) 完成时,第一个.then 会被调用。但我不确定参数cfg 来自哪里。

在函数 start() 内部被调用,第二个 .then 与原始承诺的解析被执行,原始承诺只有 .catch(reject) 在执行器之外,没有 .then 成功,到目前为止据我所知。

在此我也不确定,为什么在 start 方法之后有一个.then,而没有实际的承诺。

感谢您的帮助。

【问题讨论】:

  • "我不确定参数 cfg 来自哪里。" 这是bundleAndApplyDefaults 返回的承诺在解决时将传递给then

标签: javascript asynchronous promise


【解决方案1】:

这是很糟糕的代码,里面全是Promise constructor antipatternmixing async/await syntax with then method calls。应该是

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

【讨论】:

  • 这样更好理解,谢谢!但是,如评论@return {Promise}中所见,是否缺少return语句?
  • @NicO 异步函数总是返回一个承诺。此外,原始代码也没有显式返回 - 它只是返回一个不会有任何进一步值的 Promise,它最终会被解析。
【解决方案2】:

这是写得很糟糕的代码。这就是作者的意思:

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

此代码的工作方式与您的代码完全相同,只是没有臃肿。

包装 new Promise() 是一种反模式,在这里您必须通过转发 start() 返回的 Promise 中的值来解决/拒绝它的额外成本。

我也不确定,为什么在 start 方法之后有一个.then,而没有实际的承诺。

async 函数返回一个 Promise。

【讨论】:

  • 我认为(不必要地)混合 thenawait 仍然是糟糕的代码:-)
【解决方案3】:

因为startasync,所以它会返回一个隐含的promise。

MDN reference 有更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 2018-05-25
    • 1970-01-01
    • 2018-03-18
    • 2019-09-08
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多