我有一个用于验证字符串的方法,我希望该方法返回一个 Promise,因为正在运行的验证可能是异步的。然而,我遇到的问题是性能之一,我希望 promise 尽可能在同一个事件循环中解决(例如:当没有异步验证需要完成时),但我希望接口(interface)保持一致(例如:始终返回一个 Promise)。
下面的简化代码示例说明了我正在尝试执行的操作,但它会导致上述性能损失,因为即使可以同步执行验证,它仍然会等待下一个事件循环来处理结果。
在我的具体用例中,这种性能损失太高了。
下面是我正在做的事情的简化(最小)示例
// Array containing validation methods
const validations = [
(value) => true, // Some validation would happen here
];
// Array containing asynchronous validation methods
const asyncValidations = []; // No async validations (but there could be)
const validate(value){
// Run synchronous validations
try {
validations.forEach(validation => validation(value));
catch(error){
// Synchronous validation failed
return Promise.reject();
}
if(asyncValidations){
return Promise.all(asyncValidations.map(validation => validation(value));
}
// Otherwise return a resolved promise (to provide a consistent interface)
return Promise.resolve(); // Synchronous validation passed
}
// Example call
validate('test').then(() => {
// Always asynchronously called
});
最佳答案
你提到了两件不同的事情:
-
I want the interface to remain consistent
-
[I want to] always return a Promise
如果您想在不需要时避免异步行为,您可以这样做并保持 API 一致。但是你不能做的是“总是返回一个 Promise”,因为不可能“同步解决一个 Promise”。
您的代码当前返回一个在不需要异步验证时已解决的 Promise:
// Otherwise return a resolved promise (to provide a consistent interface)
return Promise.resolve(); // Synchronous validation passed
您可以将该代码替换为以下内容:
return {then: cb => cb()};
请注意,这只是返回一个“thenable”的对象文字(即它有一个 then 方法),并将同步执行您传递给它的任何回调。但是,它不返回一个 promise 。
关于javascript - 有什么方法可以同步解决 promise 吗? (或者可以的替代库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305616/