Использование Async / Await для подсчета ошибок из 3 разных циклов, вызывающих асинхронную функцию на каждой итерации - PullRequest
1 голос
/ 15 октября 2019

Я новичок в Async / Await и Promises, но я не новичок в Callbacks.

На сервере node.JS я пытаюсь подсчитывать ошибки от тысяч асинхронных вызовов от 3 разныхАсинхронные функции, а затем я хочу записать количество ошибок, которые произошли. У меня есть следующая структура функций:

var sender = require('./sender');
module.exports = {
    mainFunc : function (dataObjct){
        this.func1(dataObjct.arr1);
        this.func2(dataObjct.arr2);
        this.func3(dataObjct.arr3);
    },
    func1 : function (arr){
        for(let i=0;i<arr.length;i++){
            sender.method1(arr[i]);
            //sleep for 100 seconds cause i don't want too many messages at the same time
            new Promise(resolve => setTimeout(resolve, '100'));
        }
    },
    func2 : function (arr){
        for(let i=0;i<arr.length;i++){
            sender.method2(arr[i]);
            //sleep for 100 seconds cause i don't want too many messages at the same time
            new Promise(resolve => setTimeout(resolve, '100'));
        }
    },
    func3 : function (arr){
        for(let i=0;i<arr.length;i++){
            sender.method3(arr[i]);
            //sleep for 100 seconds cause i don't want too many messages at the same time
            new Promise(resolve => setTimeout(resolve, '100'));
        }
    }
}

Теперь, sender.method1, sender.method2 и sender.method3 все места в другом файле, и все они имеют асинхронный вызов внутри. Например, здесь sender.method1:

method1 : function(options){
    const from = options.from;
    const to = options.to;
    const text = options.text;
    someAsyncFunction(function(err,data) {if(err) console.log(err);},from,to,text);
}

Я хотел бы подсчитать все вхождения ошибок из sender.method1, sender.method2 и sender.method3 и зарегистрировать это количество ошибок ТОЛЬКО после всех асинхронных вызовов извсе циклы завершены.

РАЗЪЯСНЕНИЕ Я знаю, что мой код не готов делать то, что я хочу, мой вопрос заключается в том, как изменить код для достижения моих целей. Даже если это означает переписать все по-другому.

1 Ответ

1 голос
/ 15 октября 2019

синхронизировать ваш sender.methodx

обещанием

method1 : function(options){
    const from = options.from;
    const to = options.to;
    const text = options.text;
    //ensure someAsyncFunction is a promise
    return someAsyncFunction(function(err,data) {if(err) console.log(err);},from,to,text);
}

или обратным вызовом (добрый путь)

method1 : function(options, cb){
    ...
    return someAsyncFunction(function(err,data) {
        if(err){return cb(err)}
        return cb(null);
    },from,to,text);
}

Я предполагаю, что вы вернетеpromise

задержать ваш объем

func1 : function (arr, oStat){
    return arr.reduce((acc, x)=>{
        //wait at least 100ms before next sender.method call
        return Promise.all([
            sender.methodX(x),
            new Promise(resolve => setTimeout(resolve, 100))//no need to be a string btw
        ])
    }, Promise.resolve())
}

поймать ошибку вашего метода отправителя для отслеживания счетчика

здесь рассудительный: общая переменная для methodX, чтобы иметь представление передзавершение methodX:

mainFunc : function (dataObjct){
    let stats = {data1:{}, data2:{}, data3:{}};
    this.func1(dataObjct.arr1, stats.data1);
    this.func2(dataObjct.arr2, stats.data2);
    this.func3(dataObjct.arr3, stats.data3);
},
func1 : function (arr, oStat){
    oStat.count = 0;
    return arr.reduce((acc, x)=>{
        //wait at least 100ms before next sender.method call
        return Promise.all([
            sender.methodX(x).catch(e=>{
                oStat.count++;
            }),
            new Promise(resolve => setTimeout(resolve, 100))//no need to be a string btw
        ])
    }, Promise.resolve())
},

синхронизировать ваш mainFunc

Вы не хотите воспроизводить несинхронизируемое состояние someAsyncFunction, поэтому не запускайте асинхронный материал в пустоте

mainFunc : function (dataObjct){
    let stats = {data1:{}, data2:{}, data3:{}};
    return Promise.all([
        this.func1(dataObjct.arr1, stats.data1),
        this.func2(dataObjct.arr2, stats.data2),
        this.func3(dataObjct.arr3, stats.data3)
    ])
},
...