使用承诺处理承诺的数组结果

Process an array result of a promise with a promise

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

function getFoldersOf(dir) {
    return fs.readdirSync(dir).map(p => path.join(dir, p)).filter(p => fs.lstatSync(p).isDirectory());
}

现在想到用这些API(提供的功能在node中不存在,这些都是假设,我必须写它们):

我的问题是,将此函数转换为异步函数的正确方法是什么?

PS: 我怀疑我可以通过响应式扩展轻松解决这个问题!

一个选择是实施您的文件系统API,这样每个操作returns一个bluebird promise, which already provides helpers like .map() and .filter()

例如,要将节点 fs API 变成使用 bluebird promises 的节点,您可以使用 .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()));
}