带有拒绝调用和抛出错误的Promise构造函数
Promise constructor with reject call vs throwing error
在以下代码中:
var p1 = new Promise(function (resolve, reject) {
throw 'test1';
});
var p2 = new Promise(function (resolve, reject) {
reject('test2');
});
p1.catch(function (err) {
console.log(err); // test1
});
p2.catch(function (err) {
console.log(err); // test2
});
从Promise
api使用reject
(在p2
中)和使用throw
抛出错误(在p1
中)之间有什么区别吗?
完全一样吗?
如果是一样的,为什么我们需要reject
回调?
从
Promise
api使用reject
(在p2
中)和使用throw
抛出错误(在p1
中)之间有什么区别吗?
是的,不能异步使用throw
,而reject
是一个回调。例如,一些超时:
new Promise(_, reject) {
setTimeout(reject, 1000);
});
完全一样吗?
不,至少当其他代码跟随您的语句时不会。throw
立即完成解析器函数,而调用reject
则在将promise"标记"为已拒绝后继续正常执行。
此外,如果throw
错误对象,引擎可能会提供不同的异常调试信息。
对于您的具体示例,p1
和p2
与外部无法区分是正确的。
我知道这有点晚了,但我真的不认为这两个答案都能完全回答我发现这个问题时的问题,这里有一个更完整的例子。
var p1 = new Promise(function (resolve, reject) {
throw 'test 1.1'; //This actually happens
console.log('test 1.1.1'); //This never happens
reject('test 1.2'); //This never happens because throwing an error already rejected the promise
console.log('test 1.3'); //This never happens
});
var p2 = new Promise(function (resolve, reject) {
reject('test 2.1'); //This actually happens
console.log('test 2.1.1'); //This happens BEFORE the Promise is rejected because reject() is a callback
throw 'test 2.2'; //This error is caught and ignored by the Promise
console.log('test 2.3'); //This never happens
});
var p3 = new Promise(function (resolve, reject) {
setTimeout(function() { reject('test 3.1');}, 1000); //This never happens because throwing an error already rejected the promise
throw('test 3.2'); //This actually happens
console.log('test 3.3'); //This never happens
});
var p4 = new Promise(function (resolve, reject) {
throw('test 4.1'); //This actually happens
setTimeout(function() { reject('test 4.2');}, 1000); //This never happens because throwing an error already rejected the promise
console.log('test 4.3'); //This never happens
});
var p5 = new Promise(function (resolve, reject) {
setTimeout(function() { throw('test 5.1');}, 1000); //This throws an Uncaught Error Exception
reject('test 5.2'); //This actually happens
console.log('test 5.3'); //This happens BEFORE the Promise is rejected because reject() is a callback
});
var p6 = new Promise(function (resolve, reject) {
reject('test 6.1'); //This actually happens
setTimeout(function() { throw('test 6.2');}, 1000); //This throws an Uncaught Error Exception
console.log('test 6.3'); //This happens BEFORE the Promise is rejected because reject() is a callback
});
p1.then(function (resolve) {
console.log(resolve, "resolved")
}, function (reject) {
console.log(reject, "rejected")
}).catch(function (err) {
console.log(err, "caught"); // test1
});
p2.then(function (resolve) {
console.log(resolve, "resolved")
}, function (reject) {
console.log(reject, "rejected")
}).catch(function (err) {
console.log(err, "caught"); // test2
});
p3.then(function (resolve) {
console.log(resolve, "resolved")
}, function (reject) {
console.log(reject, "rejected")
}).catch(function (err) {
console.log(err, "caught"); // test3
});
p4.then(function (resolve) {
console.log(resolve, "resolved")
}, function (reject) {
console.log(reject, "rejected")
}).catch(function (err) {
console.log(err, "caught"); // test4
});
p5.then(function (resolve) {
console.log(resolve, "resolved")
}, function (reject) {
console.log(reject, "rejected")
}).catch(function (err) {
console.log(err, "caught"); // test5
});
p6.then(function (resolve) {
console.log(resolve, "resolved")
}, function (reject) {
console.log(reject, "rejected")
}).catch(function (err) {
console.log(err, "caught"); // test6
});
reject
的唯一区别和原因是当您需要异步拒绝时——例如,如果您正在转换基于回调的API,它可能需要发出异步错误信号。
var p = new Promise(function(resolve, reject){
someCallbackApi(function(err, data){
if(err) reject(err); // CAN'T THROW HERE, non promise context, async.
else resolve(data);
});
});
一个非常有趣的观察结果是,如果使用throw
,它将首先由reject
处理程序&如果拒绝处理程序未就位,则CCD_ 22处理程序。
带有拒绝处理程序块
var allowed = false;
var p1 = new Promise(
function(resolve, reject) {
if (allowed)
resolve('Success');
else
// reject('Not allowed');
throw new Error('I threw an error')
})
p1.then(function(fulfilled) {
console.log('Inside resolve handler, resolved value: ' + fulfilled);
}, function(rejected) {
console.log('Inside reject handler, rejected value: ' + rejected);
}).catch(function(error) {
console.log('Inside error handler, error value: ' + error);
})
没有拒绝处理程序块
var allowed = false;
var p1 = new Promise(
function(resolve, reject) {
if (allowed)
resolve('Success');
else
// reject('Not allowed');
throw new Error('I threw an error')
})
p1.then(function(fulfilled) {
console.log('Inside resolve handler, resolved value: ' + fulfilled);
}).catch(function(error) {
console.log('Inside error handler, error value: ' + error);
})
此外,catch块将能够捕获resolve
处理程序内部抛出的任何错误。
var allowed = true;
var p1 = new Promise(
function(resolve, reject) {
if (allowed)
resolve('Success');
else
// reject('Not allowed');
throw new Error('I threw an error')
})
p1.then(function(fulfilled) {
console.log('Inside resolve handler, resolved value: ' + fulfilled);
throw new Error('Error created inside resolve handler block');
}).catch(function(error) {
console.log('Inside error handler, error value: ' + error);
})
看起来最好使用throw
,除非你不能。如果你正在运行一些异步任务,你将不得不将reject
回调传递给异步函数。但还有一个解决办法,那就是承诺您的异步函数。上的更多信息https://stackoverflow.com/a/33446005
相关文章:
- 测试Angular Service解决错误回调中的promise
- axios promise如何定义错误
- 我如何防止错误“;未捕获(在promise中)DOMException:play()请求被对pause()的调用中断&”
- 视频播放器错误promise DOMException中未捕获
- jQuery Deferred and promise-错误:对象没有't支持属性或方法'然后'
- ES6 Promise.al()错误句柄-Is.settle()需要
- 如何使用promise正确处理express.js中的错误(字符串或对象)
- 带有拒绝调用和抛出错误的Promise构造函数
- For循环以错误的顺序返回promise
- Chained Promise给出了未定义的函数错误,但我可以单独执行这些函数
- Promise创建自定义失败不是函数Angularjs错误
- 函数返回Promise,检查错误
- AngularJS中的promise错误
- Ember.js:路由返回多个模型,包括一个promise,给出错误
- Promise.catch是吞咽错误
- 在 Promise 调用的错误函数回调后附加对象的用法是什么
- Angular 2.0 使用新的 Promise() 得到错误 TypeError: promise_1.Promise
- 由 React 组件抛出的错误,被捕获在不相关的 promise 的 catch 块中
- JavaScript 运行时错误:“Promise”未定义
- 错误:promise未定义