В этой статье , на которую я ссылался, делается следующее утверждение:
Обратные вызовы - это способ убедиться, что определенный код не выполняется, пока другой код уже не былзаконченное исполнение.
Далее статья иллюстрирует это примером:
function doHomework(subject, callback) {
alert(`Starting my ${subject} homework.`);
callback();
}
doHomework('math', function() {
alert('Finished my homework');
После этого в статьях говорится:
Как выВы увидите, что если вы введете приведенный выше код в консоль, вы получите два предупреждения спина к спине: предупреждение «начало домашней работы», а затем предупреждение «готовая домашняя работа».
Подразумевается, чточтобы с помощью обратного вызова был обеспечен желаемый порядок выполнения кода.То есть вы начинаете домашнее задание, прежде чем закончите.Тем не менее, я чувствую, что, возможно, неправильно понял весь смысл статьи, и поэтому все еще не понимаю обратных вызовов и асинхронного кода, потому что когда я замедляю первую часть функции doHomework с помощью setTimeout (), код выполняется (или, по крайней мере, возвращается) вобратный порядок:
function doHomework(subject, callback) {
setTimeout(function(){
console.log(`Starting my ${subject} homework.`);
}, 500);
callback();
}
doHomework('math', function() {
console.log('Finished my homework');
});
В результате я получаю:
steve@Dell ~/my-app $ node app.js
Finished my homework
Starting my math homework.
});
Я использую здесь узел (следовательно, console.log () заменяет alert ()), но я делаюне думаю, что это уместно.
Мне кажется, что я упустил что-то совершенно фундаментальное и мне нужно попытаться получить доступ к тому, что я пытаюсь понять, прежде чем я попытаюсь понять это.
Любая помощь в этом путешествии будет принята с благодарностью.
После получения отличной обратной связи, я думаю, что аналогия с домашним заданием была бесполезной, поэтому я сейчас использую первый пример кода в статье, на которую я ссылался.В статье приведен следующий код:
function first(){
// Simulate a code delay
setTimeout( function(){
console.log(1);
}, 500 );
}
function second(){
console.log(2);
}
first();
second();
Выше в консоли возвращается 2, а затем 1.
Я пытался (безуспешно) изменить порядок возврата на 1, а затем 2 с помощью этого:
function first(callback){
setTimeout(function(){
console.log(1);
}, 500);
callback();
}
function second(){
console.log(2);
}
first(second);
Ответ, который я получил от Cleared (до того, как он был отредактирован), заключался в том, чтобы поместить callback () в функцию setTimeout ().Он использовал пример домашней работы, но вот с этим примером:
function first(callback){
setTimeout(function(){
console.log(1);
callback();
}, 500);
}
function second(){
console.log(2);
}
first(second);
Я думаю, что это ближе к тому, к чему я представлял статью.Кажется, это имеет смысл, хотя я предполагаю, что точный контекст того, что вы делаете, и того, что вы хотите сделать, определяет, что правильно или неправильно.