[英]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之前发生:
一旦发生所有这些,API将被分叉,并且包含promises的版本将被集成到核心中。 这是一个漫长而无趣的讨论 - 在io.js / NG回购中有一个更好的讨论 ,但两者都没有太多的信息。
像bluebird这样的库为您提供了一种工具,可以快速有效地将回调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.