我有以下代码以同步方式工作:
function getFoldersOf(dir) {
return fs.readdirSync(dir).map(p => path.join(dir, p)).filter(p => fs.lstatSync(p).isDirectory());
}
现在想想使用这些API(提供的功能在节点中不存在。这些是非常低的,我必须写它们):
fs.readdirSync -> fs.readdirAsync
path.join -> path.joinAsync
fs.lstatSync -> fs.lstatAsync
我的问题是将此函数转换为异步的正确方法是什么?
PS:我怀疑我可以通过反应性扩展轻松解决这个问题!
答案 0 :(得分:1)
一个选项是实现您的文件系统API,以便每个操作返回一个bluebird
承诺,该承诺已经提供了.map()
和.filter()
等帮助程序。
例如,要将节点fs
API转换为使用bluebird
承诺的API,您可以使用.promisifyAll()
:
// node-fs.js
var Promise = require('bluebird');
module.exports = Promise.promisifyAll(require('fs'));
要使用此功能(在Node中运行应用时):
// app.js
var path = require('path');
var fs = require('./node-fs');
function getFoldersOf(dir) {
return fs.readdirAsync(dir)
.map( p => path.join(dir, p))
.filter(p => fs.lstatAsync(p).then(d => d.isDirectory()));
}