发布一个我自己写的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函数返回的结果中使用,我自己觉得把异步完美的转换成了同步。


7 回复

发布一个我自己写的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重构整个底层,就很直观了。

如果我把一个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

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 函数用于处理异步函数的回调参数。

这种方式可以让原本复杂的异步代码变得更容易理解和维护,而不需要学习额外的概念或框架。

回到顶部