Например, я хотел бы определить обратный вызов, который показывает сообщение о завершении задачи только с использованием обратных вызовов . Пожалуйста, не говорите об Обещаниях, я знаю, что это может быть применено здесь.
1. Моя первая попытка:
function doHomeWork (subject, callback) {
setTimeout(() => {
console.log(`Started my ${subject} homework`);
}, 500);
callback(subject);
}
function finishedHomework (subject) {
console.log(`Finished my ${subject} homework`);
}
doHomeWork('math', finishedHomework);
Это печатает Finished..
до Started..
, потому что callback(subject)
не ждет конца setTimeout
.
Если я позвоню callback(subject)
в setTimeout
, он напечатает оба сообщения одновременно, а не то, что я хочу.
Этот ответ помещает setTimeout
в вызов обратного вызова, но в моем гипотетическом случае время потребляет doHomeWork
, а не обратный вызов finishedHomeWork
, так что это не допустимо для этого примера.
2. Моя вторая попытка:
function homeWork (subject, callback) {
doHomeWork(subject);
callback(subject);
}
function doHomeWork (subject) {
setTimeout(() => {
console.log(`Started my ${subject} homework`);
}, 500);
}
function finishedHomework (subject) {
console.log(`Finished my ${subject} homework`);
}
homeWork('math', finishedHomework);
Это также печатает Finished..
до Started..
, потому что callback(subject)
не ждет doHomeWork(subject)
.
Итак, объяснение обратного вызова говорит, что это функция, которая будет запускаться после функции, вызывающей ее, не так ли? Но, как показали мои примеры, я не нашел способа определить его для запуска после финиша doHomeWork
.
Чего не хватает?