繁体   English   中英

为什么NodeJS不使用Promise作为readFile API?

[英]Why does NodeJS NOT use Promise for the readFile API?

https://pragprog.com/book/tbajs/async-javascript这本书中,我发现了这个:

Node的早期迭代在其非阻塞API中使用了Promises。 然而,在2010年2月,Ryan Dahl做出了切换到现在熟悉的回调(错误,结果......)格式的决定,理由是Promises是属于“userland”的更高级别的构造。

它看起来很混乱,因为作为读取文件的API,这个

fs.readFile('/etc/passwd')
.onSuccess(function(data){console.log(data)})
.onError(function(err){throw err})

看起来比这更好:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

有没有人知道为什么“Promise是一个更高级别的构造”会阻止自己在NodeJS API中使用?

Node v8附带了util.promisify ,它将回调API转换为promises,Node v10附带本机promises支持(实验性):

const fs = require('fs').promises;

// in an async function:
let data = await fs.readFile('/etc/passwd');
console.log(data);

未来是承诺:

NodeJS 使用新API的promises。 事实上,目前正在讨论如何 由于摩擦和性能问题,多年前在节点中使用Promise的早期尝试失败了。

首先要做的是:

现在promises是一种本地语言功能,但必须在它们进入核心API之前发生:

  • 承诺必须是已经发生的本地语言构造
  • 最近宣布的NodeJS和io.js合并必须发生 - 时间框架可能是短短几个月。
  • v8(JavaScript引擎)团队必须完成私有符号的工作,这将有助于快速创建承诺。 目前,promise构造函数是在本机promises中创建promise的唯一方法,它分配了一个相对昂贵的闭包。 目前正在使用Domenic在io.js和v8团队之间紧密协调,以确保正确完成。
  • v8团队必须优化承诺实现,目前本机承诺会像bluebird一样失去用户端实现。 这也正在发生。

一旦发生所有这些,API将被分叉,并且包含promises的版本将被集成到核心中。 这是一个漫长而无趣的讨论 - 在io.js / NG回购中有一个更好的讨论 ,但两者都没有太多的信息。

今天可以做些什么

这样的库为您提供了一种工具,可以快速有效地将回调API转换为承诺 您今天可以使用它们并获得该功能。

历史上回调是出于性能原因的默认值,但......

更新2017 /节点8:核心现在支持Promise!

Node.js支持自Node v8.x以来的promise。 API仍然以回调方式编写(为了向后兼容等),但现在节点核心中有一个实用程序类,用于将基于回调的API转换为基于promise的API(类似于bluebird):

https://nodejs.org/api/util.html#util_util_promisify_original

来自Node.js文档:

例如:

 const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); stat('.').then((stats) => { // Do something with `stats` }).catch((error) => { // Handle the error. }); 

或者,等效使用异步函数:

 const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); async function callStat() { const stats = await stat('.'); console.log(`This directory is owned by ${stats.uid}`); } 

更新2018年/节点10:新的fs.promises API

fs.promises API提供了一组备用的异步文件系统方法,它们返回Promise对象而不是使用回调。 API可通过require('fs')。promises访问。

https://nodejs.org/api/fs.html#fs_fs_promises_api

(此时实验,但最新节点上工作完美)

Promises是一个库,当使用promise它需要从函数返回Promise构造函数但是使用回调函数链接相同的东西是可以实现的,这就是为什么“Promise是一个更高级别的构造”

参考: 节点js中的Prom

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM