在 ECMAScript 2018(ES9)中,Promise.try 这个方法被删除了。这个决定引起了不少争议,因为 Promise.try 在一些场景下是非常有用的。但是,为了让 Promise 更加简单和易于理解,删除 Promise.try 可以说是一个比较明智的决定。
Promise.try 的作用
Promise.try 的作用是让一个函数在 Promise 中执行,并捕获可能的错误。比如,下面这个例子:
-------------- -- - -- -- --------- ---------- -- - -- -- --------- ---- -------------- -- - -- ------ ----- ---
这段代码中,Promise.try 接受一个函数作为参数,并在 Promise 中执行这个函数。如果这个函数抛出了错误,Promise 会自动捕获这个错误,并执行 catch 中的代码。
这个方法的好处在于,它可以让我们在 Promise 中执行一个函数,而不必担心这个函数会抛出错误。如果我们使用普通的 Promise,我们需要手动在函数中进行错误处理,比如:
--- ----------------- ------- -- - --- - -- -- --------- ---------- - ----- ----- - ------------ - ---------- -- - -- -- --------- ---- -------------- -- - -- ------ ----- ---
这段代码中,我们手动在 Promise 中进行了错误处理。但是,使用 Promise.try 可以让我们省去这些繁琐的步骤。
Promise.try 的问题
尽管 Promise.try 在某些场景下非常有用,但是它也存在一些问题。比如,它不符合 Promise 的基本原则之一:Promise 应该是可组合的。
Promise 的可组合性是指,我们可以将多个 Promise 组合在一起,形成一个新的 Promise。比如,下面这个例子:
----- -- - --- ----------------- ------- -- - -- -- --------- ---------- --- ----- -- - --- ----------------- ------- -- - -- -- --------- ---- ---------- --- ---------------- ------------ -- - -- -- --------- ---- -------------- -- - -- ------ ----- ---
这段代码中,我们使用 Promise.all 将 p1 和 p2 这两个 Promise 组合在一起,形成一个新的 Promise。如果 p1 或 p2 中有一个 Promise 抛出了错误,Promise.all 会自动捕获这个错误,并执行 catch 中的代码。
但是,如果我们使用 Promise.try,就无法将多个 Promise 组合在一起了。比如,下面这个例子:
-------------- -- - -- -- --------- ---------- -- - -- -- --------- ---- -------------- -- - -- ------ ----- --- -------------- -- - -- -- --------- ---- ---------- -- - -- -- --------- ---- ----- -------------- -- - -- ------ ----- ----- ---
这段代码中,我们使用了两个 Promise.try。如果第一个 Promise.try 抛出了错误,第二个 Promise.try 仍然会执行。这样,我们就无法将这两个 Promise 组合在一起了。
如何替代 Promise.try
尽管 Promise.try 已经被删除了,但是我们仍然可以使用其他方式来达到相同的效果。比如,我们可以使用 async/await:
------ -- -- - --- - -- -- --------- ----- ------------------ - ----- ----- - -- ------ ----- - -- -- --------- ---- -----
这段代码中,我们使用了 async/await 来达到和 Promise.try 相同的效果。如果我们使用普通的 Promise,我们需要手动在函数中进行错误处理。但是,使用 async/await 可以让我们省去这些繁琐的步骤,并且可以将多个 Promise 组合在一起。
总结
尽管 Promise.try 在某些场景下非常有用,但是它也存在一些问题。为了让 Promise 更加简单和易于理解,删除 Promise.try 可以说是一个比较明智的决定。但是,我们仍然可以使用其他方式来达到相同的效果,比如 async/await。我们应该根据具体的情况来选择最适合的方法。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65fec638d10417a2229fc073