使用一个相对于另一个没有优势,但是,在特定情况下
throw无法使用。但是,这些情况可以解决。
每当您进入promise回调时,都可以使用
throw。但是,如果您在任何其他异步回调中,则必须使用
reject。
例如,这不会触发捕获:
new Promise(function() { setTimeout(function() { throw 'or nah'; // return Promise.reject('or nah'); also won't work }, 1000);}).catch(function(e) { console.log(e); // doesn't happen});相反,您将面临未解决的承诺和未捕获的异常。在这种情况下,您可能想要使用
reject。但是,您可以通过两种方式解决此问题。
- 通过使用超时内的原始Promise拒绝功能:
new Promise(function(resolve, reject) { setTimeout(function() { reject('or nah'); }, 1000); }).catch(function(e) { console.log(e); // works! });- 通过通知超时:
function timeout(duration) { // Thanks joews return new Promise(function(resolve) { setTimeout(resolve, duration); }); } timeout(1000).then(function() { throw 'worky!'; // return Promise.reject('worky'); also works }).catch(function(e) { console.log(e); // 'worky!' });


