Вермешля в колбеках:
function f1(data, cb){
let modify = data *2;
cb(modify);
}
function f2(data, cb){
let modify = data *2;
cb(modify);
}
function f3(data, cb){
let modify = data *2;
cb(modify);
}
f1(2, function(data) {
f2(data, function(data2) {
f3(data2, function(data3) {
console.log(data3);
});
});
});
Вариант с промисами:
function p1(data){
return new Promise((resolve, reject)=>{
try{
resolve(data*2);
} catch(error){
reject(error);
}
});
}
function p2(data){
return new Promise((resolve, reject)=>{
try{
resolve(data*2);
} catch(error){
reject(error);
}
});
}
function p3(data){
return new Promise((resolve, reject)=>{
try{
resolve(data*2);
} catch(error){
reject(error);
}
});
}
p1(2).then(p2).then(p3).then(console.log).catch(console.error);
// Или
p1(2).then(data=>{
p2(data).then(data=>{
p3(data).then(data=>{
console.log(data);
}).catch(console.error);
}).catch(console.error);
}).catch(console.error);
// Или если юзать асинк:
(async function(){
try {
let r1 = await p1(2);
let r2 = await p2(r1);
let r3 = await p3(r2);
console.log(r3);
} catch(error){
throw error;
}
})();
Любой из вариантов по сути одно и тоже. Главное обернуть асинхронные действия, чтобы можно было строить цепочки.