用promise处理promise的数组结果

Process an array result of a promise with a promise

本文关键字:promise 结果 数组 处理      更新时间:2023-09-26

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

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

一个选项是实现您的文件系统API,这样每个操作都会返回一个bluebird承诺,该承诺已经提供了.map().filter()等帮助程序。

例如,要将Node fs API转换为使用bluebird promise的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()));
}