Node.js如何在错误回调时重新启动Async.Series

时间:2018-01-12 12:01:54

标签: javascript node.js async.js

我在我的应用中使用safe-calls。我有个问题。当“ get_data ”阶段返回错误时,如何重新启动async.series?

function get() {
    console.log('App start');
    async.series([
        open_db,
        get_data,
        close_db
    ], function (err) {
        console.log('App down');
    })
};

function open_db(callback) {
    mongoose.connect('mongodb://localhost/app', function (err) {
        if (err) throw err;
        console.log('App connect to DB');
        callback();
    });
};


function get_data(callback) {
    if (err) {
        console.log('Error')
        callback();
    } else {
       console.log('Ok');
       callback();
    }
};


function close_db(callback) {
    mongoose.disconnect(function() {
        console.log('App disconnect from DB');
        callback();
    });
};

在“ get_data ”阶段,我使用websockets.subscribe操作,并将数据从另一台服务器保存到数据库。当websocket连接断开时,我需要以一段时间间隔重试与服务器的连接

2 个答案:

答案 0 :(得分:0)

function query_data() {
    async.series([
        open_db,
        get_data,
        close_db
    ], function (err) {
        if (err)
            ...
    })
};

function open_db(callback, attempt_no) {
    mongoose.connect('mongodb://localhost/app', function(err) {
        if (!err)
            return callback();

        attemp_no = !attempt_no ? 1 : attempt_no + 1;

        if (attempt_no > 5)
            return callback(new Error('Maximum number of attempts exceeded'));

        setTimeout(() => open_db(callback, attempt_no), 500);
    });
};

function get_data(callback) {
    if (err) 
        return callback(err);

    // do-smth-with-data and call callback
};

function close_db(callback) {
    mongoose.disconnect(callback);
};

答案 1 :(得分:0)

使用async.retry

function all_get_data(cb) {
    console.log('App start');
    async.series([
        open_db,
        get_data,
        close_db
    ], function (err) {
        if (err) { 
            console.log('App down');
            return cb(err)
        }
        return cb()
    })
};

// try calling apiMethod 3 times, waiting 200 ms between each retry
async.retry({times: 3, interval: 200}, all_get_data, function(err, result) {
    // do something with the result
});