使用promise处理promise的数组结果

时间:2015-12-19 09:53:31

标签: javascript promise rxjs

我有以下代码以同步方式工作:

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:我怀疑我可以通过反应性扩展轻松解决这个问题!

1 个答案:

答案 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()));
}