Node.js 核心中的承诺 [重复]

Posted

技术标签:

【中文标题】Node.js 核心中的承诺 [重复]【英文标题】:Promises in Node.js core [duplicate] 【发布时间】:2018-12-09 04:57:11 【问题描述】:

我听说 Promises 可用于 Node 核心 API。 比如fs,怎么用promise,直接省略callback吗?

fs.readFile(file).then(v => console.log(v)); 

或者我们如何使用?

目前对于 Node.js 版本早于 10,我猜,它的背后是一个标志?也许:node --promises

【问题讨论】:

【参考方案1】:

到目前为止,大多数基于 Node 回调的 API 都应该手动进行承诺,以便使用承诺。

util.promisify 从 Node 8 开始可用(也是 polyfillable),并允许承诺任何使用错误优先回调的 API,包括内置的 fs

const  promisify  = require('util');
const fs =  require('fs');
const readFile = promisify(fs.readFile);

readFile(file).then(console.log);

一些使用非错误优先回调的 API 也通过 util.promisify.custom 符号支持它,例如setTimeout:

promisify(setTimeout)(100).then(...);

fs.promises experimental API 从节点 10 开始可用(polyfillable 在节点 8 及更高版本中)并包含承诺的 fs 模块,正如另一个问题中已经提到的:

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

fsp.readFile(file).then(console.log);

对于批量承诺,可以使用pify 等第三方工具。

第三方 Promisification 包可用于大多数内置和流行的第三方基于回调的包,这些包可以转换为 Promise,例如fs-extra,它是 fs 的首选替代品,其中包括基本的 graceful-fs 包。

【讨论】:

【参考方案2】:

此实验性功能是在节点 v10.0.0 中添加的。您需要使用 fs/promises 而不是 fs

【讨论】:

你确定吗? node.js doc 表示:require('fs').promises @jfriend00 好像是不久前的 fs/promises。是的,现在是require('fs').promises。他们不会将其标记为实验性的。 我仔细研究了一下,似乎fs/promises 是最新代码显示的内容。它从fs.promises 更改为。不确定它是否已经发布,当然还没有与文档同步。 @jfriend00 仅供参考,刚刚偶然发现this comment。当前节点 master 使用 fs.promises。 @estus - 是的,他们似乎还没有真正决定如何在所有模块中完成。【参考方案3】:

使用可以使用mz:

var fs = require('mz/fs');

【讨论】:

这不是问题的重点。有很多方法可以“承诺”现有的 fs 模块或附加模块来做到这一点。现在的问题是使用内置的 Promise。 这非常简单且容易被忽视 - 谢谢

以上是关于Node.js 核心中的承诺 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Node.js Buffer(缓冲区)

带你从零学Node.js

node.js 中的嵌套承诺是不是正常?

Node Js,Git,Heroku:Git承诺不推送git,因为大文件过去曾提交了几次提交[重复]

如何在 node.js 中的特定持续时间后强制解决承诺? [复制]

如何遍历 node.js 中的一系列承诺?