我正在构建一个使用的库,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
方法。看到:
一次使用后,您可能需要许多模块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支持 :
但在此期间您可以使用mz
。
有关更多上下文,另请参见 问题#7549 v1:执行不带回调的异步函数应返回promises :
另请参阅节点的 承诺工作组存储库 :
更新: 似乎上述PR 5020不会很快降落在Node上,这要感谢Benjamin
Gruenbaum在评论中指出。因此,似乎使用Bluebird的promisify
和promisifyAll
有用的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页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?