javascript - 减少可能是异步且具有回调的函数数组
问题描述
我很好奇如何通过创建函数数组并使用.reduce
循环它们来创建 express 中间件的简单版本。
function fullPath(context) {
context.fullPath = nodePath.isAbsolute(context.path) ? context.path : nodePath.join(context.cwd, context.path);
}
function extension(context) {
context.extension = nodePath.extname(context.path);
}
function contents(context, callback) {
return fs.readFile(context.fullPath, { encoding: 'utf8' }, (err, contents) => {
if (err) throw err;
context.contents = contents;
return callback(null, context);
});
}
function fileLoader(context, callback) {
return [
fullPath,
extension,
contents
].reduce((context, fn) => {
return fn(context, callback)
}, context)
}
.reduce
循环每个函数,将回调传递给每个函数,并让它们正确嵌套,然后在最后调用父回调的逻辑应该是什么?
解决方案
这是这个工作:
const nodePath = require('path');
const fs = require('fs');
function fullPath(context) {
console.log('fullPath')
context.fullPath = nodePath.isAbsolute(context.path) ? context.path : nodePath.join(context.cwd, context.path);
}
function extension(context) {
console.log('extension')
context.extension = nodePath.extname(context.path);
}
function contents(context, callback) {
console.log('contents')
return fs.readFile(context.fullPath, { encoding: 'utf8' }, (err, contents) => {
console.log('contents-i')
if (err) return callback(err);
context.contents = contents;
return callback();
});
}
function middleware(stack) {
return (context = {}, master) => {
var hasError = false
return stack.reduceRight((callback, fn) => {
if (hasError) return () => {};
return () => {
const isAsync = fn.length === 2
if (isAsync) {
fn(context, (err) => {
if (err) {
hasError = true
return master(err);
}
callback(null, context);
})
} else {
fn(context)
callback(null, context)
}
}
}, master)()
}
}
const fileLoader = middleware([fullPath, extension, contents])
fileLoader({ path: './example.md', cwd: '' }, (err, context) => {
console.log({ err, context })
})
推荐阅读
- angular - 如何以编程方式控制 Angular Material Sidenav
- sql - 用于更新 Excel 数据透视表的 VBS 脚本
- pointers - 在函数中使用多个指针
- python - 将压缩后的 Stata 文件从 URL 读取到 pandas
- android - 在 React Native 项目中重新生成 Android 和 IOS 文件夹
- ethereum - 有没有办法将函数返回为 false 并且仍然执行代码直到它恢复,eq: function owner() { owner = 0x0; 恢复(); }
- r - 将用 R 制作的闪亮/传单地图发布到网站
- java - 错误:无法找到或加载主类 Maven Spring Boot 应用程序 - 可执行 JAR
- c# - C 结构并在 C# 中使用 C dll
- xna - XNA Mediaplayer.Play() 开始在不同时间跨计算机播放?