关于Nodejs async 返回值的问题

关于Nodejs async 返回值的问题

用async控制 数据库的查询,查询会很多 彼此之间有的有依赖关系有的没有,所以我再用的时候分了几个方法

exports.addTest=function(){
   async.waterfall([
   	//balabala的  这里是一大堆 查询
	//最后调用其他函数
	add()
   ])
}

function add(){
async.waterfall([
        function(cb) {
			//一个查询
        },
        function(n, cb) {	
             var results=HasRejectedTests(n,type,origrec)//这个地方取不到 HasRejectedTests的返回值
             console.log("res:"+results)
             cb(null,results);
        }
    ], function(err, results) {
		console.log(results)
    });
}

function HasRejectedTests(){
   async.series([
   //又是一大推查询
   ],function(err, results) {
      **想在这里返回数据 但是不能返回**
   }))
}

大概就是这样的结构, 我想在HasRejectedTests 中返回一个值给add(), 但是返回的是空,不知道怎么搞,懂的前辈 给讲解讲解呗


8 回复

当然可以。在你的代码中,async.waterfallasync.series 都是用来处理异步操作的,但它们的使用方式需要一些调整来确保你能够正确地传递返回值。我们可以通过调整你的代码结构来解决这个问题。

首先,让我们重新审视一下你的代码,并对其进行适当的修改:

修改后的代码

const async = require('async');

exports.addTest = function () {
    async.waterfall([
        // balabala 的 一大串查询
        add
    ]);
};

function add(callback) {
    async.waterfall([
        function (cb) {
            // 第一个查询
            cb(null, 'some data');
        },
        function (n, cb) {
            HasRejectedTests(n, 'type', 'origrec', function (err, results) {
                if (err) return cb(err);
                console.log("res:" + results);
                cb(null, results);
            });
        }
    ], function (err, results) {
        if (err) return console.error(err);
        console.log(results);
    });
}

function HasRejectedTests(n, type, origrec, callback) {
    async.series([
        function (cb) {
            // 模拟第一个查询
            setTimeout(() => {
                cb(null, 'query result 1');
            }, 1000);
        },
        function (cb) {
            // 模拟第二个查询
            setTimeout(() => {
                cb(null, 'query result 2');
            }, 1000);
        }
    ], function (err, results) {
        if (err) return callback(err);
        console.log("HasRejectedTests results: ", results);
        callback(null, results);
    });
}

解释

  1. 回调函数的使用

    • HasRejectedTests 函数中,我们使用了一个回调函数来传递结果。这是因为 async.series 内部的每个任务都会调用一个回调函数来传递结果。
    • add 函数中,我们在 HasRejectedTests 调用后使用了一个回调函数来接收 HasRejectedTests 的返回值。
  2. 错误处理

    • HasRejectedTestsadd 函数中,我们都添加了错误处理逻辑,以确保如果发生错误,我们可以及时捕获并处理它。
  3. 异步操作的顺序

    • 使用 async.waterfall 来确保异步操作按顺序执行。这样可以确保前一个操作的结果被传递到下一个操作中。

通过这种方式,你可以确保在 HasRejectedTests 中获取的数据能够正确地传递到 add 函数中。希望这能帮助你解决问题!


用 eventproxy 会比 async 清晰: https://github.com/JacksonTian/eventproxy

自己顶~

异步编程,用Callback啊 function HasRejectedTests(callback){ async.series([ //又是一大推查询 ],function(err, results) { 想在这里返回数据 但是不能返回 ** callback(results);** })) }

async里面相对外部也是异步吧,你想办法把外面的挪到里面呗。

这时候eventproxy稍微比async好一点,这两者的API很有点不一样。

我也有这个需求,在一个函数checkDate内调用了async.waterfall(…)执行另外三个串行的判断函数,最后想给checkDate函数进行返回值,

checkDate(date, time) { var check; async.waterfall([ func1, func2, func3 ], function(err, result){ check = result }) }

由于nodejs异步的坑,上述操作无法实现,最后通过给checkDate加callback回调实现,如下:

checkDate(date, time, callback) { var check; async.waterfall([ func1, func2, func3 ], function(err, result){ callback(result); }) }

var status; checkDate(date, time, function(check){ status = check; //do something here… })

在你的代码中,HasRejectedTests 函数内部使用了 async.series 来处理多个异步操作。你需要确保在 async.series 的回调函数中正确地返回结果。然后,你可以在 add 函数中正确处理这些结果。

以下是修改后的代码示例:

const async = require('async');

exports.addTest = function () {
    async.waterfall([
        // balabala 这里是一大堆查询
        // 最后调用其他函数
        add
    ]);
};

function add(cb) {
    async.waterfall([
        function (cb) {
            // 一个查询
            cb(null, 'some data');
        },
        function (n, cb) {
            HasRejectedTests(n, type, origrec, (err, results) => {
                if (err) return cb(err);
                console.log("res:" + results);
                cb(null, results);
            });
        }
    ], function (err, results) {
        console.log(results);
    });
}

function HasRejectedTests(n, type, origrec, cb) {
    async.series([
        // 又是一大推查询
        function (callback) {
            // 模拟一个查询
            setTimeout(() => {
                callback(null, 'query result 1');
            }, 1000);
        },
        function (callback) {
            // 模拟另一个查询
            setTimeout(() => {
                callback(null, 'query result 2');
            }, 500);
        }
    ], function (err, results) {
        if (err) return cb(err);
        // 返回查询结果
        cb(null, results);
    });
}

解释:

  1. async.waterfall: 在 add 函数中使用 async.waterfall 处理多个异步任务。
  2. HasRejectedTests: 在 HasRejectedTests 函数中,使用 async.series 处理多个查询。每个查询完成后,调用 callback 将结果传递给下一个函数。
  3. 回调处理: 在 HasRejectedTests 的回调函数中,通过 cb(null, results) 返回最终的结果。这样,你就可以在 add 函数中获取到这些结果。

这样,你就可以正确地在 HasRejectedTests 中返回查询结果,并在 add 函数中获取到这些结果。

回到顶部