bra*_*rad 8 javascript node.js async-await es6-promise
我正在尝试为json-api找到一个好的反序列化器/反规范化器(事实证明非常困难)。
我遇到了一些例子,其中反序列化过程(基本上只是反规范化关系和展平属性)被定义为异步函数。这是一个这样的例子,但是我发现了很多。
现在,我对node / javascript的理解是,它基于受I / O约束的系统,因此其设计应使操作应为非阻塞的,以便可以在I / O期间安排其他操作,从而获得并发操作。
但是,我不了解的是这样的反序列化器中的用法。反序列化时,我们有完整的有效负载,没有任何I / O发生。我只能猜测作者假设关系查找可以全部同时发生,但是,由于javascript仍然是单线程的,因此我看不到它如何以任何方式提高性能。
在我看来,这只是使确定性操作变得不确定(因为我认为时间表除反序列化之外还可以安排其他操作)。
我在这里想念什么吗?使这种异步方式真的有好处吗?我不是前端(或节点)开发人员,所以我觉得自己缺少了一些东西(因为我已经看到很多在反序列化器中使用过的模式)
如果有任何区别,它将在浏览器(而不是节点后端)中运行。
看来,您作为示例提到的库的作者没有正确使用 async / wait :
// see: https://github.com/wopian/kitsu/blob/master/packages/kitsu-core/src/deattribute/index.js
// v does await nothing, as it receives an array
// v unneccessary
await data.map(async el => deattribute(el))
Run Code Online (Sandbox Code Playgroud)
这里根本没有理由使用async/ await,所以我怀疑它在库中是否有任何用途。
javascript(在浏览器中)中的异步/承诺在没有 I/O 的情况下是否有益?
不会。虽然 Promise 总是异步解析,但它们仍然会出现在所谓的微任务队列(在浏览器中)中,该队列将在浏览器重新渲染之前被清空,因此调用异步函数不会帮助您解冻 UI。
我只能猜测作者假设关系查找可以同时发生,但是,由于 javascript 仍然是单线程的,我看不出这如何以任何方式提高性能。
我同意,这根本不会提高性能。
在我看来,这只是使确定性操作变得非确定性(因为我认为调度还可以调度除反序列化之外的其他操作)。
不,它不能,因为不涉及将引擎从当前任务中释放出来的异步 IO。因此它仍然会以阻塞方式运行。