众所周知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函数返回的结果中使用,我自己觉得把异步完美的转换成了同步。
如果我把一个mongo方法转为同步这么写对不 sync.block(function () { function mongoSync(colName, cb) { mongodb.open(function (err, db) { if (err) { } db.collection(colName, function (err, collection) { if (err) { } collection.find({}).toArray(function (err, doc) { if (err) { } console.log(doc); cb(err, doc) }) }) }) } var result = sync.wait(mongoSync('Editor_Template’, sync.cb(‘err’,’doc’))); console.log("TA:= " + result.doc); }) 有这样的报错 Process finished with exit code -2147483645