当前位置: 首页 > 面试题库 >

使用异步/等待+蓝鸟来PromisifyAll

程俊力
2023-03-14
问题内容

我正在构建一个使用的库,async/await我想知道是否可以将本机模块与fs一起使用async/await。我知道async/await这只是背景中的Promises,所以有本机的方法来实现方法或功能的实现吗?目前,我正在使用Bluebird,但我不知道这是否是一个坏模式

例:

    const Bluebird = require("bluebird");
    const { access } = require("fs");

    const accessAsync = Bluebird.promisify(access);

    async function checkInput(options) {
      await accessAsync(options.file);
      /// etc
      return options;
    }

    module.exports = (options) => {
      Promise.resolve(options)
        .then(checkInput)
    };

我将原生Promises和Bluebird结合在一起。我应该只使用Bluebird吗?


问题答案:

我正在构建一个使用async / await的库,我想知道是否可以在async / await中使用诸如fs之类的本机模块。

是。使用Bluebird可以比示例更简单:

let fs = Promise.promisifyAll(require('fs'));

// and in async function:
let contents = await fs.readFileAsync('file.txt', 'utf-8');

请注意,您需要Async在方法名称的末尾添加。

或者,您可以使用mz模块,而无需添加Async方法。看到:

  • https://www.npmjs.com/package/mz

一次使用后,您可能需要许多模块npm install mz-例如,您可以require('mz/fs')使用它,并且它立即使您可以使用fs返回promise 的模块版本,而不是进行回调。与async
await结合使用,您可以执行以下操作:

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

// and in async function:
let contents = await fs.readFile('file.txt', 'utf-8');

上面的代码仍然是非阻塞的。

请参阅以下答案,在此我将显示模块mz版本的示例crypto并对其进行更详细的说明:

参见示例:

let crypto = require('mz/crypto');

async function x() {
  let bytes = await crypto.randomBytes(4);
  console.log(bytes);
}

您可以对许多其他模块执行相同的操作,包括:

  • child_process
  • crypto
  • dns
  • fs
  • readline
  • zlib

我知道async / await只是在后台执行Promises,所以…是否有一种本机的方法来实现方法或功能的实现?

很快,Node将以本机方式支持它-请参阅 PR#5020为Promises添加Core支持

  • https://github.com/nodejs/node/pull/5020

但在此期间您可以使用mz

有关更多上下文,另请参见 问题#7549 v1:执行不带回调的异步函数应返回promises

  • https://github.com/nodejs/node-v0.x-archive/issues/7549

另请参阅节点的 承诺工作组存储库

  • https://github.com/nodejs/promises

更新: 似乎上述PR 5020不会很快降落在Node上,这要感谢Benjamin
Gruenbaum在评论中指出。因此,似乎使用Bluebird的promisifypromisifyAll有用的mz模块将是将语言的现代功能与Node的核心模块一起使用的唯一简便方法。幸运的是,它们工作得很好,所以这不是一个大问题。



 类似资料:
  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 问题内容: 给出以下代码: 产生以下错误: TS2322:类型’Promise []’无法分配给类型’number []’。类型’Promise 不可分配给类型’number’。 我该如何解决?怎样才能让和一起工作? 问题答案: 这里的问题是,您正在尝试兑现承诺而不是承诺。这没有达到您的期望。 当传递给的对象不是Promise时,只需立即按原样返回值,而不是尝试解析它。因此,由于您在此处传递了(P

  • 问题内容: 什么是处理这种情况的最佳方法。我处于受控环境中,所以我不想崩溃。 从setTimeout内抛出时,我们将始终获得: 如果抛出发生在setTimeout之前,那么bluebirds catch将捕获它: 结果是: 很棒-但是如何在节点或浏览器中处理这种性质的恶意异步回调。 问题答案: 承诺不是域,它们不会捕获异步回调中的异常。你就是做不到。 然而诺言来捕捉从内抛出的异常/ / 构造函数的

  • 我想进行一个基于当前状态的API调用,但不能使setState函数作为异步函数工作。 给我错误: 类型为“”的参数(状态:只读)= 如果我在setState方法之外获取数据,它会起作用,但我害怕对过时的页码进行API调用:

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?