javascript - 并行开发同步/阻塞和异步/非阻塞库-api 的好方法是什么? (JavaScript)

标签 javascript asynchronous api-design

我重写了这个问题,因为旧版本显然具有误导性。 请阅读文本并确保您理解我的要求。如果 仍然有任何东西留在黑暗中为了清楚起见,我将修改这个问题。 只需通知我即可。

我的一个项目是将库从 Python 移植到 JavaScript。 当涉及到 I/O 时,Python 库是完全阻塞/同步的 等等。这对于 Python 代码来说当然是完全正常的。

我计划将同步/阻塞方法按原样移植到 JavaScript。 这有几个原因,是否值得努力是一个 不同的问题。

此外我不想添加异步/非阻塞 api。

把它想象成节点中的 fs 模块,即 fs.openfs.openSync 共存。

该库是纯 JavaScript,将在 Node 和浏览器中运行。

问题是开发这两个共存 API 的好的/最好的方法是什么。

我相信只在一个地方发生同样的事情是件好事。 因此,可以共享实现的某些部分的方法将是更可取的。 当然不是不惜任何代价,这就是我要问的原因。

我在这里提出了一种方法的建议,但我打算将其作为 可能的答案。但是,我正在等待一些严肃的讨论发生 在我决定接受什么作为答案之前。

目前的方法是:

  • 分别实现这两个 api,绝对对异步函数使用 promises。
  • 使用类似 obtain api proposal 的东西 - beeing 一个更集成的方法

最佳答案

如果您在 node.js 中谈论 I/O,那么大多数 I/O 方法都有同步版本。

不存在从异步到同步的直接转换。我可以想到两种方法:

  1. 让每个异步方法运行一个轮询循环,等待异步任务完成后再返回。
  2. 放弃模仿同步代码的想法,转而投资于更好的编码模式(例如 promises)

为了说明,我假设选项 2 是更好的选择。以下示例使用 Q promises (使用 npm install q 轻松安装。

promises 背后的想法是,尽管它们是异步的,但返回对象是对值的promise,就好像它是一个普通函数一样。

// Normal function
function foo(input) {
  return "output";
}

// With promises
function promisedFoo(input) {
  // Does stuff asynchronously
  return promise;
}

第一个函数接受输入并返回结果。第二个示例接受一个输入并立即返回一个 promise ,该 promise 最终将在异步任务完成时解析为一个值。然后,您按如下方式管理此 promise :

var promised_value = promisedFoo(input);
promised_value.then(function(value) {
  // Yeah, we now have a value!
})
.fail(function(reason) {
  // Oh nos.. something went wrong. It passed in a reason
});

使用 promise,您不必再担心什么时候会发生。您可以轻松地链接 promise ,这样事情就可以同步发生,而无需疯狂的嵌套回调或 100 个命名函数。

非常值得学习。请记住, promise 旨在使异步代码表现得像同步代码,即使它没有阻塞。

关于javascript - 并行开发同步/阻塞和异步/非阻塞库-api 的好方法是什么? (JavaScript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557857/

相关文章:

c# - 数据层的异步是否要求整个调用栈也是异步的?

javascript - 如何在带有 Node.js Commander 的 repl/bash 中继续接收异步 console.log 消息?

Javascript 创建帐户未链接到 Firebase 数据库

javascript - 用于导出到 CSV/Excel 的数据 URI(无服务器端请求): browser support/limitations?

javascript - 在 JavaScript 中解析 WSDL 文件的最佳方式

python - 如何从异步方法/线程传递/交换数据?

.net - 为什么 C++/CLI 编译器不会针对过时的属性调用生成警告?

c# - 哪种结果模式最适合公共(public) API,为什么?

c++ - 在 C++ 中,是否可以实现推进使 "current"元素无效的迭代器接口(interface)?

javascript - 使用映射返回具有键和值的对象