前文
本文介绍了在 Javascript 中使用 reject 和 throw 的情况,并解释了它们之间的区别。
reject
它是 Javascript promise 中的一个内置函数,用于 promise 对象返回因特定原因而被拒绝的内容。
语法:
js
Promise.reject(reason)
reason 可以是简单的字符串信息,也可以是错误对象。
example code 1:传递字符串信息作为 reason。
js
<script>
const p = new Promise( ( resolve, reject ) => {
reject( 'promise failed!' );
});
p.catch(err => {
console.log( err );
});
</script>
输出
promise failed!
example code 2: 传递一个 Error 实例作为 reason。
js
<script>
const p = new Promise( ( resolve, reject ) => {
reject( new Error( 'promise failed!' ) );
});
p.catch( err => {
console.log( err );
});
</script>
输出: 正如你所看到的,当我们传递一个错误对象时,我们会得到整个错误树。
Error: promise failed!
at :4:9
at new Promise ()
at :2:11
at render (tryit.php:202)
at tryit.php:170
at dispatch (jquery.js:4435)
at r.handle (jquery.js:4121)
throw
在 JavaScript 中用于创建和抛出用户定义的异常。使用 JavaScript throw 语句,您可以完全控制程序流程,并生成用户定义的错误信息。如果我们在上述两个示例中使用 throw 语句代替 reject(),结果将完全相同(你可以自己尝试一下,将 reject 替换为 throw)。 示例: 不过,throw 可以在任何 Javascript 的 try-catch 块中使用,而不仅限于 promise。
example code 1: 在 promise 使用 throw
js
<script>
const p = new Promise( ( resolve, reject ) => {
throw( 'promise failed!' );
});
p.catch(err => {
console.log( err );
});
</script>
输出
promise failed!
example code 2: 直接使用 throw
js
<script>
var a = 20;
try
{
if( a < 25 )
throw ( 'Less than 25' );
console.log( 'Okay!' );
}
catch(err)
{
console.log( err );
}
</script>
输出:
Less than 25
既然我们已经了解了 reject
和 throw
的基本工作原理,下面我们就来谈谈它们之间的区别:
比较 reject / throw:
差异 1: 如果 Promise 内有异步回调函数,我们就不能在回调函数内使用 throw,因为 catch() 不会识别它,我们将在输出中得到一个错误。
example code1:
js
<script>
const p = new Promise( ( resolve, reject ) => {
// Asynchronous function called within the Promise.
setTimeout( () => {
throw( 'promise failed!' );
}, 1000);
});
// The catch block will not be able to recognize the
// error thrown. It will become an uncaught exception.
p.catch( ( err )=> {
console.log( err );
});
</script>
输出: 正如你所看到的,错误信息("promise failed!")已经打印在输出中,但我们的 promise 的 catch() 函数并没有打印出来。它变成了一个未捕获的异常。
example code2 :解决上述问题,我们可以使用 reject() 方法。
js
<script>
const p = new Promise( ( resolve, reject ) => {
// Asynchronous function called within the Promise.
setTimeout( () => {
reject( 'promise failed!' );
}, 1000);
});
// The catch block will be able to recognize
// the rejected statement.
p.catch( (err) => {
console.log( err );
});
</script>
输出: 在这里,catch 块能够识别 reject() 并打印相应的信息。
差异 2: 这是一个非常基本的区别。throw 抛出异常后,函数执行将推出, 而 reject 不会。
example code 1:
js
<script>
const p = new Promise( ( resolve, reject ) => {
throw( 'promise failed!' );
console.log("Here");
});
p.catch( err => {
console.log( err )
});
</script>
输出: 从这个示例可以看出,语句 console.log("Here") 没有被执行。
example code 2: 为了解决上述问题,我们使用 reject 代替 throw 语句,函数内部的 reject 之后的语句将在 catch 块之前被执行。
js
<script>
const p = new Promise( ( resolve, reject ) => {
reject( 'promise failed!' );
console.log( "Here" );
});
p.catch( err => {
console.log( err )
});
</script>
输出: