JavaScript库中的阻止/非阻止功能?

时间:2019-12-05 04:58:56

标签: javascript node.js promise async-await

我正在更新一个库,其中包含潜在地昂贵的函数,这些函数理想地可以以阻塞或非阻塞方式使用。在JavaScript当前状态下,实现这些功能的最佳方法是什么?每个功能需要两个版本(一个阻塞和一个非阻塞)吗?最后,如何最好地为节点和浏览器实现无阻塞功能?

3 个答案:

答案 0 :(得分:0)

我将为每个函数提供两个版本,并让异步版本返回promise,而不是接受回调参数。

如何执行此操作取决于您。您可以从字面上返回一个诺言,然后解决/拒绝它,或者可以将函数标记为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
  }
}

答案 1 :(得分:0)

听起来您对同步和异步有些困惑。给定的函数具有同步结果或异步结果。非此即彼。这个事实取决于函数的功能,而不取决于调用者的想法或要求。

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

如果一个函数在其实现内部未调用任何异步函数,则它是一个同步函数,您应该为其提供一个同步接口,因为它总是比异步接口更易于使用,并且同步接口也可以与其他异步代码一起使用因此非常灵活。

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

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

因此,选择取决于您在库函数中正在执行的操作,而没有其他选择。


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

答案 2 :(得分:-3)

您可以使用async关键字 就像:

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