我刚刚看到这段代码:
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
承诺出现在那里。那么在上面显示的代码中如何或为什么在没有返回的情况下工作?
答案 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();
调用没有尝试使用应该返回的承诺。