javascript - 有什么方法可以同步解决 promise 吗? (或者可以的替代库)

标签 javascript ecmascript-6 promise es6-promise

我有一个用于验证字符串的方法,我希望该方法返回一个 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
});

最佳答案

你提到了两件不同的事情:

  1. I want the interface to remain consistent

  2. [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 。

您还可以通过实现 then 的可选 onRejected 参数来扩展此方法。方法和/或catch方法。

关于javascript - 有什么方法可以同步解决 promise 吗? (或者可以的替代库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57305616/

相关文章:

javascript - Typescript 声明已定义字符串或任何字符串的类型

javascript - 使像 lodash 这样的库在 Aurelia 中全局可用的最佳实践是什么?

javascript - rails : Passing controller variable to JS using ERB slows page?

javascript - 为什么 const 名称需要在 ReactJS 中用大括号括起来

javascript - 是否有可用于 JavaScript ES6 的 BNF 语法?

javascript - 如何检查对象是否是 Promise?

javascript - 如何将元素传递到 setTimeOut 函数

javascript - 使用redux-saga时,为什么yield语句是执行的值而不是undefined?

javascript - 如何引用从链式函数返回的 promise ?

javascript - 等待执行新的内部 promise