Обещания позволяют вам избежать типа вложенности обратного вызова, как вы только что показали.Посмотрите мой пример, который иллюстрирует ваш пример в форме Promise:
function getStats(access_token, time_range, x, prevResult) {
return new Promise((resolve, reject) => {
if (prevResult) {
resolve([...prevResult, "test", "test", "test"]);
}
return resolve(["test", "test", "test"]);
});
}
app.get('/profile', (req, res) => {
var access_token = 1234;
getStats(access_token, 's', 'x')
.then((a) => {
console.log(a);
return getStats(access_token, 's', 'y', a);
})
.then((b) => {
console.log(b);
return getStats(access_token, 'm', 'x', b);
})
.then((c) => {
console.log(c);
return getStats(access_token, 'm', 'y', c);
})
.then((d) => {
console.log(d);
return getStats(access_token, 'l', 'x', d);
})
.then((e) => {
console.log(e);
return getStats(access_token, 'l', 'y', e);
})
.then((f) => {
console.log(f);
res.send(f.join("\n"));
});
});
Как вы можете видеть вложенную структуру обратного вызова и заменить ее на гораздо более читаемый формат.Подробнее об обещаниях здесь .
Выше можно даже переписать, используя Promise.all , что выглядит еще лучше:
function getStats(access_token, time_range, x) {
return new Promise((resolve, reject) => {
return resolve(["test", "test", "test"]);
});
}
app.get('/profile', (req, res) => {
var access_token = 1234;
Promise.all([
getStats(access_token, 's', 'x'),
getStats(access_token, 's', 'y'),
getStats(access_token, 'm', 'x'),
getStats(access_token, 'm', 'y'),
getStats(access_token, 'l', 'x'),
getStats(access_token, 'l', 'y')
]).then((values) => {
console.log(values);
res.send(values.join("\n"));
});
});