JavaScript,返回箭头函数内的承诺

JavaScript,返回箭头函数内的承诺,javascript,es6-promise,Javascript,Es6 Promise,我刚刚看到了以下代码: const buildSW = () => { // This will return a Promise <- that comment was present on the code workboxBuild .injectManifest({ swSrc: 'src/sw.js' // some code }) .then(({ count, size, warnings }) => {

我刚刚看到了以下代码:

const buildSW = () => {
  // This will return a Promise <- that comment was present on the code
  workboxBuild
    .injectManifest({
      swSrc: 'src/sw.js'
      // some code
    })
    .then(({ count, size, warnings }) => {
      // some code
    })
    .catch(console.error);
};
buildSW();
该代码是本指南的一部分:


此处有
返回
承诺。那么,在上面显示的代码中,如何或为什么不返回就工作?

注释是在它后面的行上注释,并且是多余的。例如

// a() will return a Promise
a().then(() => () // duh
…因为它相当于:

const promise = a();
promise.then(() => ()
不应该是?:
返回workboxBuild.injectManifest({…etc

这取决于您想要的
buildSW
合同

如前所述,
buildSW
不返回任何内容并处理自己的错误,使用
.catch(console.error)
将错误发送到控制台。适用于事件处理程序-例如
button.onclick=buildSW

但是如果您希望从其他地方调用
buildSW
,更好的约定是返回承诺,并将错误处理留给调用方:

const buildSW = () => {
  return workboxBuild.injectManifest({swSrc: 'src/sw.js'})
    .then(({ count, size, warnings }) => {
      // some code that may also fail
    });
};
buildSW().catch(console.error);
我对评论感到困惑,因为我看不到实际上有一个
return
语句,就像在指南中一样。它不应该有一个吗

是的,应该有一个
return
语句。当然,函数已经捕获错误并记录它们,但是始终从异步函数返回承诺仍然是一个好主意

那么,在上面显示的代码中,如何或为什么在没有返回的情况下工作


它之所以能工作是因为
buildSW();
您正在进行的呼叫不会尝试使用应该返回的承诺。

workboxBuild.injectManifest
将返回一个承诺。我认为您将该注释解释为关于
buildSW
的注释,但看起来他们是在评论
workboxBuild.injectManifest
。代码用法也暗示了这一点任何来自
buildSW
的返回值都将被忽略如果不处理返回值,它不会有什么区别,但是是的,如果有
return
语句,它会更有意义。@pmiranda我们只能猜测原始注释者的意图,包括代码和注释。通常关于函数的文档注释会超出函数的范围,例如文档因为
buildSW
将高于它的实现。它看起来不像
buildSW
是为了返回任何东西,而是调用
injectManifest
并用它返回的承诺做一些事情,仅此而已。在许多指南中都有关于
return
的代码,我在这里放了一个原始示例的链接另一个:另一个来自Facebook的CRA(他们创建了一个示例)“评论是在它后面的一行上发表的”-我不同意。在谷歌指南中,它是从它复制粘贴的,当然是指
injectManifest
以及
buildSW
方法。@Bergi好吧,这是有意义的(因为下一行开头是
return
),而在这里不是。但是可以肯定的是,复制粘贴错误是另一个可能的答案。
const buildSW = () => {
  return workboxBuild.injectManifest({swSrc: 'src/sw.js'})
    .then(({ count, size, warnings }) => {
      // some code that may also fail
    });
};
buildSW().catch(console.error);