我可以 "promisify" 仅使用异步功能吗?
Can I "promisify" a function by just using async?
所以我有一个函数应该立即 return 一个被拒绝或解决的 Promise,即它基本上是一个我想要 "promisify".
的同步函数
遇到这种情况我通常是这样的:
func() {
// some code to check for an error
if (hasError)
return Promise.reject(new Error("Failure"));
}
return Promise.resolve("Success");
}
现在,随着 ES2017 中 "async" 函数的可用性,我似乎也可以这样做:
async func() {
// some code to check for an error
if (hasError)
throw new Error("Failure");
}
return "Success";
}
所以我基本上使用 async
只是为了 "promisify" 我的函数,而不在函数体的任何地方使用 await
。正如我所见,这个变体应该做的完全一样。我是对的,还是有其他我不知道的副作用?
我想我更喜欢这种模式,因为它更短一些,仅从函数定义中就可以清楚地看出它是异步的,并且任何 JavaScript 错误(如类型错误)也会导致拒绝让我的整体代码在出现意外错误时反应更优雅。
每当你声明一个异步函数一个AsyncFunction
对象被创建,根据MDN将return一个承诺:
A Promise which will be resolved with the value returned by the async function, or rejected with an uncaught exception thrown from within the async function.
所以是的,使用 async
将 promisify 一个函数。
此外,让我们做一些测试;
async function fn(val) {
console.log(val);
if (val) {
return "true";
}
throw new Error("false");
}
console.log(Object.getPrototypeOf(fn).constructor)
console.log(fn(true) instanceof Promise);
console.log(Object.getPrototypeOf(fn(true)).constructor)
console.log(fn(false) instanceof Promise);
console.log(Object.getPrototypeOf(fn(false)).constructor)
fn(true).then(val => console.log(val));
fn(false).catch(err => console.log("ERROR"));
所以我有一个函数应该立即 return 一个被拒绝或解决的 Promise,即它基本上是一个我想要 "promisify".
的同步函数遇到这种情况我通常是这样的:
func() {
// some code to check for an error
if (hasError)
return Promise.reject(new Error("Failure"));
}
return Promise.resolve("Success");
}
现在,随着 ES2017 中 "async" 函数的可用性,我似乎也可以这样做:
async func() {
// some code to check for an error
if (hasError)
throw new Error("Failure");
}
return "Success";
}
所以我基本上使用 async
只是为了 "promisify" 我的函数,而不在函数体的任何地方使用 await
。正如我所见,这个变体应该做的完全一样。我是对的,还是有其他我不知道的副作用?
我想我更喜欢这种模式,因为它更短一些,仅从函数定义中就可以清楚地看出它是异步的,并且任何 JavaScript 错误(如类型错误)也会导致拒绝让我的整体代码在出现意外错误时反应更优雅。
每当你声明一个异步函数一个AsyncFunction
对象被创建,根据MDN将return一个承诺:
A Promise which will be resolved with the value returned by the async function, or rejected with an uncaught exception thrown from within the async function.
所以是的,使用 async
将 promisify 一个函数。
此外,让我们做一些测试;
async function fn(val) {
console.log(val);
if (val) {
return "true";
}
throw new Error("false");
}
console.log(Object.getPrototypeOf(fn).constructor)
console.log(fn(true) instanceof Promise);
console.log(Object.getPrototypeOf(fn(true)).constructor)
console.log(fn(false) instanceof Promise);
console.log(Object.getPrototypeOf(fn(false)).constructor)
fn(true).then(val => console.log(val));
fn(false).catch(err => console.log("ERROR"));