>[danger]Promise函数里有error会怎么样?必须catch吗,用then呢? 在 Promise 函数中,如果抛出一个异常(错误),则会导致 Promise 的状态变为已拒绝(rejected),并且传递该异常作为拒绝原因(rejected reason)。此时,如果没有手动捕获该异常,就会导致运行时错误。 对于这种情况,最好是使用 `.catch()` 方法来进行异常处理,以便在发生错误时能够及时捕获和处理。`.catch()` 方法可以链式调用多次,以便处理不同类型的错误或重试失败的操作。 示例: ```javascript function asyncFunc() { return new Promise(function(resolve, reject) { setTimeout(function() { try { throw new Error('Something went wrong'); resolve('Async operation completed'); } catch (error) { reject(error); } }, 1000); }); } asyncFunc() .then(function(result) { console.log(result); }) .catch(function(error) { console.error('Error:', error.message); }); ``` 在上述示例中,Promise 函数中使用 `try-catch` 块捕获了一个异常,并使用 `reject` 函数将 Promise 对象的状态设置为已拒绝(rejected)。在 `then` 方法中,如果 Promise 的状态变为已解决(fulfilled)则打印异步操作完成的结果,如果状态变为已拒绝(rejected)则打印错误信息。这样就充分利用了 Promise 的链式调用特性,使得代码更加简洁、易读和易维护。 在 Promise 中也可以使用 `then` 方法的第二个参数来进行异常处理。这样的话,如果 Promise 的状态变为已拒绝(rejected)则会直接执行该方法,而不需要显式地使用 `.catch()` 方法。 示例: ```javascript function asyncFunc() { return new Promise(function(resolve, reject) { setTimeout(function() { try { throw new Error('Something went wrong'); resolve('Async operation completed'); } catch (error) { reject(error); } }, 1000); }); } asyncFunc() .then( function(result) { console.log(result); }, function(error) { console.error('Error:', error.message); } ); ``` 虽然使用 `then` 方法的第二个参数也可以处理异常,但是最好还是使用 `.catch()` 方法进行异常处理,因为它更加专门化。如果异常处理代码比较复杂,使用 `.catch()` 方法可以使代码更加清晰、易读和易于维护。