javascript - node.js - 如何按顺序运行一系列回调函数?

标签 javascript node.js asynchronous synchronization synchronous

像许多其他人一样,我想将第三方模块 (Patio) 的异步功能转换为同步功能。

function get_user_message_list(parameters, array, response)
{
var new_array = [];
for (var i in array) {

    var json = array[i];
    json['content']['users_seen'] = ["1757842565"];
    json['content']['users_not_seen'] = [];

    new_array.push(json);
}

console.log("NEW ARRAY :");
console.log(new_array);

response.writeHeader(200, {'Content-Type':'application/json'});
response.end(JSON.stringify(new_array));
}

function get_json_message(parameters, json)
{
console.log("JSON OBJECT :");
console.log(json);
var dataset = db.from(TABLES.USER).join(TABLES.MOVIE_LIST, {MLUserId: sql.URId}).join(TABLES.MOVIE, {MVId: sql.MLMovieId});

dataset.where('MLSeen={seen} AND MVSourceId={movie} AND MVSource={source} AND URId!={user}', {seen: 1, movie: json['content']['movie_id'], source: json['content']['movie_source'], user:parameters.FACEBOOK_ID}).all().then(function(users){
    if (users) {
        for (var j in users) {
            json['content']['users_seen'].push(users[j].URId);
        }
    }

    //console.log(json['content']['users_seen']);

    dataset.where('MLSeen={seen} AND MVSourceId={movie} AND MVSource={source} AND URId!={user}', {seen: 0, movie: json['content']['movie_id'], source: json['content']['movie_source'], user:parameters.FACEBOOK_ID}).all().then(function(users){
        if (users) {
            for (var j in users) {
                json['content']['users_not_seen'].push(users[j].URId);
            }
        }

        console.log(json);
    }, errorHandler);
}, errorHandler);
}

在 get_user_message_list 函数中,我迭代到一个数组中,并为每次迭代调用异步函数。在这个异步函数中,我使用 Patio 模块向 MySQL 数据库发出请求。但是如您所见,我必须在将结果发送到上一个函数后等待获得查询结果。

如何等待得到查询结果再发送给下一个函数?

最佳答案

当需要解决问题时,您可以并且应该将异步函数转换为行为类似于同步函数的东西。你不能永远不是正确的答案,不应该的是由程序员来回答。

所以,我最近在 nodeunit 模块中找到了一些代码,可能会对您有所帮助。它触发异步函数,跟踪哪些已准备就绪。所有请求都进入后,触发回调。这可能是您问题解决方案背后的想法(所以不,这不是最终解决方案)。

async.forEachSeries = function (arr, iterator, callback) {
    if (!arr.length) {
        return callback();
    }
    var completed = 0;
    var iterate = function () {
        iterator(arr[completed], function (err) {
            if (err) {
                callback(err);
                callback = function () {};
            }
            else {
                completed += 1;
                if (completed === arr.length) {
                    callback();
                }
                else {
                    iterate();
                }
            }
        });
    };
    iterate();
};

此测试促使我了解它是如何完成的:

exports['series'] = function (test) {
    var call_order = [];
    async.series([
        function (callback) {
            setTimeout(function () {
                call_order.push(1);
                callback(null, 1);
            }, 25);
        },
        function (callback) {
            setTimeout(function () {
                call_order.push(2);
                callback(null, 2);
            }, 50);
        },
        function (callback) {
            setTimeout(function () {
                call_order.push(3);
                callback(null, 3, 3);
            }, 15);
        }
    ],
    function (err, results) {
        test.equals(err, null);
        test.same(results, [1, 2, [3, 3]]);
        test.same(call_order, [1, 2, 3]);
        test.done();
    });
};

编程愉快!

关于javascript - node.js - 如何按顺序运行一系列回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11670508/

相关文章:

node.js - 不能用 async 和 await 做 http 请求

node.js - process.nextTick() 是否立即执行

ios - NSURLSessionDownloadTask 有时会导致零数据

javascript - 在fullcalendar v2中,如何动态设置选项

javascript - 使用变量全局替换字符串

javascript - 如何使用 Clojurescript 与 html DOM 交互?

javascript - 由于 Git 的 index.lock,WebStorm 不断使我本地运行的服务器崩溃

node.js - 检查用户状态

javascript - 传单 map 单击更改颜色,然后再次单击时删除

javascript - Instafeed js 在每 4 个图像周围添加包装