Javascript ES2018中finally()和then()之间的差异

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文

在ES2018之前,每当我必须执行任何清理逻辑时,我总是在承诺链的末尾嵌套一个额外的
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