使用承诺处理承诺的数组结果
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中不存在,这些都是假设,我必须写它们):
fs.readdirSync -> fs.readdirAsync
path.join -> path.joinAsync
fs.lstatSync -> fs.lstatAsync
我的问题是,将此函数转换为异步函数的正确方法是什么?
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()));
}
我有以下以同步方式工作的代码:
function getFoldersOf(dir) {
return fs.readdirSync(dir).map(p => path.join(dir, p)).filter(p => fs.lstatSync(p).isDirectory());
}
现在想到用这些API(提供的功能在node中不存在,这些都是假设,我必须写它们):
fs.readdirSync -> fs.readdirAsync
path.join -> path.joinAsync
fs.lstatSync -> fs.lstatAsync
我的问题是,将此函数转换为异步函数的正确方法是什么?
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()));
}