发布一个我自己写的Nodejs异步转同步模块
发布一个我自己写的Nodejs异步转同步模块
众所周知NodeJS回调陷阱是个大问题,网上现在也有一些解决方案。
我不喜欢用q或者async这类的模块,我不想为了解决一个异步陷阱,再去额外学习新的概念,还要再用新的思维编码,我觉得这是为了解决问题引入更复杂的问题,所以我偏爱fibers类型的纤程解决方案。 但是fibers用起来还是不太直观,根据另外一个封装模块,按照我自己的使用习惯也封装了一下,用 npm install simplesync 来安装。 代码例子如下:
//首先引入模块,
var sync = require('simplesync');
//任何同步调用都必须位于一个sync.block块内, sync.block描述可以嵌套。
sync.block(function() {
//标准异步调用方式
Some_Async_Function(123, function(ta) {
//这里参数ta的值是124
});
//这是同步调用方式, result.ta就是124
var result = sync.wait(Some_Async_Function(123, sync.cb(“ta”)));
//多个参数就这么办
function Async_Function2(input, callback) {
callback(input, 456);
}
//这里result.ta就是123, result.ta2就是456了
result = sync.wait(Async_Function2(123, sync.cb("ta", "ta2")));
}
//异步调用函数可以在sync.block内,也可以不在,无所谓。
function Some_Async_Function(input, callback) {
callback(input+1);
}
一共就三个函数,sync.block定义需要使用同步方式的代码块,sync.wait等待异步函数完成,sync.cb模拟任义参数的回调(用来传给异步函数,当回调参数) 这样很直观,可以把任何以往已经使用过的异步函数转换成同步函数,无任何限制。 而且sync.cb回调函数中的参数,可以直接在sync.wait函数返回的结果中使用,我自己觉得把异步完美的转换成了同步。
发布一个我自己写的Nodejs异步转同步模块
众所周知NodeJS回调陷阱是个大问题,网上现在也有一些解决方案。我不喜欢用q
或者async
这类的模块,我不想为了解决一个异步陷阱,再去额外学习新的概念,还要再用新的思维编码,我觉得这是为了解决问题引入更复杂的问题,所以我偏爱fibers类型的纤程解决方案。但是fibers用起来还是不太直观,根据另外一个封装模块,按照我自己的使用习惯也封装了一下,用 npm install simplesync
来安装。
安装
npm install simplesync
使用示例
// 首先引入模块,
var sync = require('simplesync');
// 任何同步调用都必须位于一个sync.block块内, sync.block描述可以嵌套。
sync.block(function() {
// 标准异步调用方式
Some_Async_Function(123, function(ta) {
// 这里参数ta的值是124
});
// 这是同步调用方式, result.ta就是124
var result = sync.wait(Some_Async_Function(123, sync.cb("ta")));
// 多个参数就这么办
function Async_Function2(input, callback) {
callback(input, 456);
}
// 这里result.ta就是123, result.ta2就是456了
result = sync.wait(Async_Function2(123, sync.cb("ta", "ta2")));
});
// 异步调用函数可以在sync.block内,也可以不在,无所谓。
function Some_Async_Function(input, callback) {
callback(input + 1);
}
解释
- sync.block: 定义需要使用同步方式的代码块。在这个块内的所有异步调用都会被同步化处理。
- sync.wait: 等待异步函数完成,并返回结果。它会阻塞当前执行流,直到异步函数完成。
- sync.cb: 模拟任意参数的回调函数。你可以传递任意数量的参数给它,这些参数会在回调函数中被传递回去。
通过这种方式,你可以将任何以往已经使用过的异步函数转换成同步函数,无任何限制。而且sync.cb
回调函数中的参数,可以直接在sync.wait
函数返回的结果中使用,使得代码更加直观易读。
希望这个模块能够帮助大家更好地处理NodeJS中的异步问题。
更新了一下,https://www.npmjs.org/package/simplesync 增加了中文文档,增加了对一组函数并行执行后的转同步操作。
fiber要看你怎么用。比如,用fiber重构整个底层,就很直观了。
nodejs 標準回調必須是 callback(err, val) 吧。 你把第一個參數當返回值用的話各種標準函數都轉不了的啊
要实现一个将异步操作转换为同步风格的Node.js模块,可以使用纤程(fibers)的概念。纤程提供了一种轻量级的线程机制,允许你在同一个线程内暂停和恢复执行,从而实现同步风格的异步调用。
下面是一个简单的示例模块simplesync
,它可以让你用同步的方式来调用原本异步的函数:
安装
你可以通过npm来安装这个模块:
npm install simplesync
使用方法
const Fiber = require('fibers');
const simplesync = require('simplesync');
// 定义一个异步函数
function Some_Async_Function(input, callback) {
setTimeout(() => {
callback(input + 1);
}, 1000);
}
// 引入模块并使用
const sync = simplesync();
sync.block(function() {
// 同步调用异步函数
const result = sync.wait(Some_Async_Function(123));
console.log(result); // 输出: 124
// 多个参数的异步函数
const result2 = sync.wait((callback) => {
Some_Async_Function2(123, callback);
}, sync.cb("ta", "ta2"));
console.log(result2); // 输出: { ta: 124, ta2: 456 }
});
// 异步函数定义
function Some_Async_Function2(input, callback) {
setTimeout(() => {
callback(input, 456);
}, 1000);
}
simplesync
模块实现
const Fiber = require('fibers');
module.exports = function() {
return {
block: function(blockFn) {
Fiber(blockFn).run();
},
wait: function(asyncFunc, cbArgs) {
return new Promise((resolve, reject) => {
const fiber = Fiber.current;
const callback = function(...args) {
if (cbArgs) {
args = cbArgs(args);
}
resolve(args[0]);
fiber.run();
};
asyncFunc(callback);
});
},
cb: function(...keys) {
return function(args) {
const obj = {};
for (let i = 0; i < keys.length; i++) {
obj[keys[i]] = args[i];
}
return obj;
};
}
};
};
解释
sync.block
函数用于定义需要同步执行的代码块。sync.wait
函数用于等待异步函数完成,并返回结果。sync.cb
函数用于处理异步函数的回调参数。
这种方式可以让原本复杂的异步代码变得更容易理解和维护,而不需要学习额外的概念或框架。