Просто используйте обещания (или обратные вызовы)
Я знаю, что все ненавидят JavaScript, и поэтому эти анти-идиоматические переносчики и новые языковые "возможности" существуют, чтобы JavaScript выглядел как C # и так далее, но, честно говоря, просто проще использовать язык так, как он был изначально разработан ( в противном случае используйте Go или другой язык, который на самом деле ведет себя так, как вы хотите - и в любом случае более производительный). Если вам необходимо выставить async / await в вашем приложении, поместите его в интерфейс, а не засоряйте его повсюду.
My 2 ¢.
Я просто напишу некоторый код psuedo, чтобы показать вам, как легко это может быть:
function doItAll(jobs) {
var results = [];
function next() {
var job = jobs.shift();
if (!job) {
return Promise.resolve(results);
}
return makeRequest(job.url).then(function (stuff) {
return updateDb().then(function (dbStuff) {
results.push(dbStuff);
}).then(next);
});
}
return next();
}
function makeRequest() {
return new Promise(function (resolve, reject) {
var resp = http.get('...', {...});
resp.on('end', function () {
// ... do whatever
resolve();
});
});
}
Simple. Легко читать. Соотношение 1: 1 между тем, как выглядит код, и тем, что происходит на самом деле. Не пытайтесь «заставить» JavaScript вести себя не так, как задумывалось.
Чем дольше вы боретесь с обучением пониманию асинхронного кода, тем больше времени потребуется для его понимания.
Просто погрузитесь и научитесь писать JavaScript «путем JavaScript»! : D