如何拒绝async/await函数返回的promise?
例如,最初
foo(id: string): Promise<A> {
return new Promise((resolve, reject) => {
someAsyncPromise().then((value)=>resolve(200)).catch((err)=>reject(400))
});
}
Run Code Online (Sandbox Code Playgroud)
转换为async/await
async foo(id: string): Promise<A> {
try{
await someAsyncPromise();
return 200;
} catch(error) {//here goes if someAsyncPromise() rejected}
return 400; //this will result in a resolved promise.
});
}
Run Code Online (Sandbox Code Playgroud)
那么,在这种情况下,我怎么能正确地拒绝这个承诺呢?
javascript asynchronous typescript es6-promise ecmascript-2017
ES5语言规范清楚地表明它的Error(foo)
作用与此相同new Error(foo)
.
但我注意到,在野外,较长的new Error(foo)
形式更常见.
这有什么理由吗?
是否有使用new Error(foo)
优先使用的情况Error(foo)
?
因此,Node.js中回调函数的一般约定是"保留"错误的第一个参数(如果存在).例如:
callSomeBlockingFcn( function callbackWhenDone(err, result) {
if( err ) ...
});
Run Code Online (Sandbox Code Playgroud)
如果您需要返回多个错误 - 例如多个数据验证错误 - 是否认为传递错误对象数组的形式不佳?例:
var callSomeBlockingFcn = function(callback) {
// multiple errors to report back...
callback( [ err1, err2, ...] );
}
Run Code Online (Sandbox Code Playgroud)
或者最好避免使用数组并使用引用数组的属性返回单个对象(如果需要)?例:
var callSomeBlockingFcn = function(callback) {
// multiple errors to report back...
callback( { errors: [ err1, err2, ...] } );
}
Run Code Online (Sandbox Code Playgroud) 不使用关键字抛出错误有什么缺点吗new
?
throw new Error('Something went wrong');
/* vs */
throw Error('Something went wrong');
Run Code Online (Sandbox Code Playgroud) 我async/await
在我的Node.js项目中使用.在某些地方我需要从async
函数返回错误.如果我使用Promises,我可以这样做:
function promiseFunc() {
return new Promise((res, rej) => {
return rej(new Error('some error'))
})
}
Run Code Online (Sandbox Code Playgroud)
但我正在使用async
函数,所以没有res
和rej
方法在那里.那么,问题是:我可以throw
在async
函数中出错吗?或者它被认为是好/坏的做法?
我想做的一个例子:
async function asyncFunc() {
throw new Error('some another error')
}
Run Code Online (Sandbox Code Playgroud)
我也可以这样重写它:
async function anotherAsyncFunc() {
return Promise.reject(new Error('we need more errors!'))
}
Run Code Online (Sandbox Code Playgroud)
但第一个看起来更清楚,我不确定应该使用哪一个.
我见过 3 种在 JavaScript 中抛出错误的不同方式:
throw 'message';
throw Error('message');
throw new Error('message');
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别?
javascript ×6
es6-promise ×2
async-await ×1
asynchronous ×1
idiomatic ×1
node.js ×1
promise ×1
throw ×1
typescript ×1