2016-12-19 6 views
4

Я хочу переопределить async.waterfall() (или написать timed_waterfall()), чтобы он печатал время выполнения для каждого шага. Как это сделать?Временная версия для async waterfall

async.waterfall([ 
    f=>{ 
     console.log('step1'); 
     f(); 
    }, 
    f=>{ 
     console.log('step2'); 
     f(); 
    }, 
    f=>{ 
     console.log('step3'); 
     f(); 
    }, 
], 
()=>{ 
    console.log('done'); 
}) 

Желаемый результат:

step1 
1ms 
step2 
2ms 
step3 
1ms 
done 
5ms 

ответ

1

Совместимость с async.jswaterfall():

function timed_waterfall(tasks, ender) { 
    function color(a) { 
     if (a == undefined) { return '\u001b(B\u001b[m' } 
     return '\u001b[38;5;'+a+'m' 
    } 

    var N = 0; 

    function go(args) { 
     function f() { 
      if (N>0)console.timeEnd(color(1)+' * '+N+color()) 
      var res = Array.prototype.slice.apply(arguments); 
      if (res[0]) { 
       ender.apply(null, res); 
      } 
      else { 
       res.splice(0, 1); 
       var cb = tasks.shift(); 
       if (cb) { 
        res.push(f); 
        console.time(color(1)+' * '+(++N)+color()) 
        cb.apply(null, res); 
       } 
       else { 
        res.unshift(null) 
        ender.apply(null, res); 
       } 
      } 
     } 
     f(null); 
    } 
    go([]); 
} 

Это просто не модифицирует печатать итоговые данные, а также.

1

Как насчет этого?

function timedWaterfall (tasks, callback) { 
 
    console.time('total') 
 
    async.waterfall(tasks.map(function (task, i) { 
 
    return function() { 
 
     if (i > 0) 
 
     console.timeEnd('step' + i) 
 
     console.time('step' + (i + 1)) 
 
     return task.apply(null, arguments) 
 
    } 
 
    }), 
 
    function() { 
 
    console.timeEnd('total') 
 
    callback.apply(null, arguments) 
 
    }) 
 
}

1

Вам не нужно изменять waterfall вообще - просто написать функцию-обертку, которая добавляет времени к (функции обратного вызова взятием) Задача:

function withTiming(fn, name) { 
    if (typeof name == "number") name = "step"+name; 
    return function() { 
     var start = Date.now() 
     var lastIndex = arguments.length-1; 
     var cb = arguments[lastIndex]; 
     arguments[lastIndex] = function() { 
      console.log(name+": "+(start-Date.now())+"ms"); 
      cb.apply(this, arguments); 
     }; 
     return fn.apply(this, arguments); 
    }; 
} 

Вы можете использовать его вместе с async.js следующим образом:

async.waterfall([ 
    f=>{ 
     console.log('step1'); 
     f(); 
    }, 
    f=>{ 
     console.log('step2'); 
     f(); 
    }, 
    f=>{ 
     console.log('step3'); 
     f(); 
    }, 
].map(withTiming),()=>{ 
//^^^^^^^^^^^^^^^ 
    console.log('done'); 
}) 

 Смежные вопросы

  • Нет связанных вопросов^_^