我重写了这个问题,因为旧版本显然具有误导性。 请阅读文本并确保您理解我的要求。如果 仍然有任何东西留在黑暗中为了清楚起见,我将修改这个问题。 只需通知我即可。
我的一个项目是将库从 Python 移植到 JavaScript。 当涉及到 I/O 时,Python 库是完全阻塞/同步的 等等。这对于 Python 代码来说当然是完全正常的。
我计划将同步/阻塞方法按原样移植到 JavaScript。 这有几个原因,是否值得努力是一个 好但不同的问题。
此外我不想添加异步/非阻塞 api。
把它想象成节点中的 fs 模块,即 fs.open
和
fs.openSync
共存。
该库是纯 JavaScript,将在 Node 和浏览器中运行。
问题是开发这两个共存 API 的好的/最好的方法是什么。
我相信只在一个地方发生同样的事情是件好事。 因此,可以共享实现的某些部分的方法将是更可取的。 当然不是不惜任何代价,这就是我要问的原因。
我在这里提出了一种方法的建议,但我打算将其作为 可能的答案。但是,我正在等待一些严肃的讨论发生 在我决定接受什么作为答案之前。
目前的方法是:
- 分别实现这两个 api,绝对对异步函数使用 promises。
- 使用类似 obtain api proposal 的东西 - beeing 一个更集成的方法
最佳答案
如果您在 node.js 中谈论 I/O,那么大多数 I/O 方法都有同步版本。
不存在从异步到同步的直接转换。我可以想到两种方法:
- 让每个异步方法运行一个轮询循环,等待异步任务完成后再返回。
- 放弃模仿同步代码的想法,转而投资于更好的编码模式(例如 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/