繁体   English   中英

JavaScript 库中的阻塞/非阻塞函数?

[英]Blocking/non-blocking functions in JavaScript library?

我正在移植一个库,其中包含需要能够在同步或异步模式下使用的 CPU 昂贵的函数。 考虑到它们需要在节点和浏览器中工作,在当前的 JavaScript(setTimeout、web-workers、其他东西)中实现这些功能的最佳方法是什么?

我将有每个函数的两个版本,并让异步版本返回承诺而不是接受回调参数。

你如何做到这一点取决于你。 您可以从字面上返回一个承诺,然后解决/拒绝它,或者您可以将函数标记为async ,这使它们隐式地返回一个承诺,然后返回响应(这就像用一个值来解决)。

class LibClass {
  a() { // async a with promises returns Promise<ret>
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        const ret = doWork()
        resolve(ret)
      }, 1)
    })
  }
  a_sync() { // sync a returns ret
    const ret = doWork()
    return ret
  }
  async b(data) { // async function b returns Promise<ret>
    const ret = doWork()
    return ret
  }
}

这听起来您对同步和异步有点困惑。 给定的函数要么具有同步结果,要么具有异步结果。 非此即彼。 这个事实是由函数的作用决定的,而不是由调用者的想法或想要的决定。

如果一个函数调用任何异步或可能在其实现中调用任何异步,则其最终结果是异步的,并且无法使其同步。 它必须有一个异步接口。 您不能提供同步接口,因为结果根本无法同步返回。

如果一个函数在它的实现中没有调用任何异步的东西,那么它就是一个同步函数,你应该给它一个同步接口,因为它总是比异步接口更容易使用,同步接口也可以与其他异步代码一起使用,所以它足够了灵活的。

所以,如果你有一个完全同步的库,你可以同时提供同步和异步接口,但没有理由这样做。 只提供一个同步接口,因为它总是更容易使用。

而且,库中执行任何异步操作的任何函数都必须具有异步接口。

因此,选择取决于您在库函数中所做的事情,而不是其他任何事情。


仅供参考,偶尔,可能有一个函数有时具有同步结果,有时具有异步结果。 典型的例子是当一个值可能已经在本地缓存并立即可用,但如果不在缓存中,它必须从某个远程资源异步检索。 在这种情况下,您提供一个异步接口,即使结果立即可用,您仍然异步返回它。 这样调用者就可以得到一个统一的接口,可以以任何一种方式工作,并且调用者不必编写两种不同的方式来使用您的函数。 注意:这在库设计中应该是罕见的情况,而不是通常的情况。 通常,一个函数要么一直是内部同步的,要么一直是异步的。

您可以使用 async 关键字,例如:

class LibClass{
      async a(){
         return Promise.resolve('success');
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM