Javascript ES2018中finally()和then()之间的差异
在ES2018之前,每当我必须执行任何清理逻辑时,我总是在承诺链的末尾嵌套一个额外的Javascript ES2018中finally()和then()之间的差异,javascript,promise,ecmascript-next,Javascript,Promise,Ecmascript Next,在ES2018之前,每当我必须执行任何清理逻辑时,我总是在承诺链的末尾嵌套一个额外的then,否则我会在上面的then和catch中复制,例如 新承诺( (res,rej)=>setTimeout(()=>rej({}),1000) ).那么( res=>console.log(res) ).接住( err=>console.error(err) ).那么( ()=>console.log('Finally') )finally()执行承诺是履行还是拒绝。也许这个例子会有所帮助 编辑:MDN文
then
,否则我会在上面的then
和catch
中复制,例如
新承诺(
(res,rej)=>setTimeout(()=>rej({}),1000)
).那么(
res=>console.log(res)
).接住(
err=>console.error(err)
).那么(
()=>console.log('Finally')
)
finally()
执行承诺是履行还是拒绝。也许这个例子会有所帮助
编辑:MDN文档给出了与then()
的这些差异:
finally()
方法与调用非常相似。然后(最终,最终)
但是有两个区别:
- 在内联创建函数时,您可以传递它一次,而不是被迫声明它两次,或者为它创建变量
回调不会收到任何参数,因为没有可靠的方法来确定承诺是否得到了履行 拒绝。这个用例正好适用于您不关心的情况 拒绝原因,或履行价值,因此没有必要 提供它finally
- 不同于
(将使用Promise.resolve(2)。然后(()=>{},()=>{})
未定义的
进行解析),
将通过Promise.resolve(2)。最后(()=>{})
解决2
- 类似地,与
(这将通过Promise.reject(3)不同。然后(()=>{},()=>{})
实现),未定义的
将被Promise.reject(3)。最后(()=>{})
拒绝3
当承诺被拒绝时,
then
回调不会执行,即使是由catch
调用返回的承诺也会发生这种情况:当其回调抛出或返回被拒绝的承诺时err=>console.error(err)
可能不会这样做,但您永远不知道
同样,如果您只想处理原始承诺中的错误,而不是然后回调中的错误,我建议您这样做。我会写信的
promise.then(console.log, console.error).finally(() => console.log('Finally'));
其他区别在于签名:finally
回调不接收任何参数,p.finally()
返回的承诺将实现/拒绝与p
相同的结果(除非回调中存在异常或返回拒绝).@epascarello这是一本关于蓝鸟的书,基本上都是一样的东西,不同之处都在下面列出。它们不完全一样。@Herohtar当然,但文档将其与进行对比。然后(()=>{},()=>{})
。我说的是。然后(()=>{})。catch(()=>{})。然后(()=>{})
最后一个然后之后的catch
。这就是重点。@Alex,但你可能不会总是在catch
之后使用它。而且你可能也不会总是有catch