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,Git,Heroku:Git承诺不推送git,因为大文件过去曾提交了几次提交[重复]