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);