【问题标题】:Promises in Node.js core [duplicate]Node.js 核心中的承诺 [重复]
【发布时间】: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

【问题讨论】:

    标签: node.js es6-promise


    【解决方案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。
      • 这非常简单且容易被忽视 - 谢谢
      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2018-06-08
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多