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

时间:2021-05-25 15:45:35

标签: 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 }) => {
      // some code
    })
    .catch(console.error);
};
buildSW();

代码似乎正在运行,已经投入生产 1 年了,但我对 This will return a Promise 的注释感到困惑,因为我没有看到实际上有一个 return 语句,并且整个代码在{}里面。

不应该吗?:

return workboxBuild
    .injectManifest({ ...etc

代码是本指南的一部分:

https://developers.google.com/web/tools/workbox/guides/generate-service-worker/workbox-build

return 承诺出现在那里。那么在上面显示的代码中如何或为什么在没有返回的情况下工作?

2 个答案:

答案 0 :(得分:1)

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

// a() will return a Promise
a().then(() => () // duh

...因为它等价于:

const promise = a();
promise.then(() => ()
<块引用>

不应该吗?:return workboxBuild.injectManifest({ ...etc

这取决于您希望 buildSW 拥有的合同。

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

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

const buildSW = () => {
  return workboxBuild.injectManifest({swSrc: 'src/sw.js'})
    .then(({ count, size, warnings }) => {
      // some code that may also fail
    });
};
buildSW().catch(console.error);

答案 1 :(得分:0)

<块引用>

我对评论感到困惑,因为我没有看到实际上有 return 语句,就像指南中那样。不应该有一个吗?

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

<块引用>

那么上面显示的代码中没有返回值是如何或为什么工作的?

它之所以有效,只是因为您正在执行的 buildSW(); 调用没有尝试使用应该返回的承诺。

相关问题