2
Надо делать вызов внутри коллбека. Для этого придётся переписать цикл на рекурсию:
function doSmth(x, callback) {
setTimeout(callback, Math.random() * 100 | 0, null, x);
}
var data = [1, 2, 3, 4, 5, 6, 7, 8];
(function go(i) { // <================== рекурсивная функция вместо цикла...