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