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

问题描述 投票:9回答:4

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中使用?

javascript node.js asynchronous promise nonblocking
4个回答
15
投票

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的版本将被集成到核心中。 Here is a long and uninteresting discussion关于它 - 在io.js / NG回购中有一个更好的,但两者都没有太多的信息。

今天可以做些什么

这样的图书馆为您提供快速有效的即时convert a callback API to promises工具。您今天可以使用它们并获得该功能。


4
投票

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

更新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}`);
}

3
投票

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

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

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

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


-4
投票

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

参考:Promises in node js

© www.soinside.com 2019 - 2024. All rights reserved.