Вы задали два вопроса,
Гарантируется ли последовательность выполнения обратного вызова?
Отвечает ли обратный вызов только на события?
Ответ
- Да.
Насколько я понимаю, callback
просто вызывает другую функцию, которая должна быть запущена сейчас (когда она вызывается)
Это гарантия запуска сразу после вызова ,
Чтобы убедиться, что что-то вызывается до того, как будет выполнен обратный вызов, просто поместите вещи, которые вы хотите вызвать, в первую очередь, прежде чем будет выполнен обратный вызов.
Например, из вашего кода, немного изменив его, обратный вызов гарантированно будет запущен после выполнения console.log.
function foo(callback) {
setTimeout(() => {
console.log("Do something with unknown time");
callback();
}, 2000);
}
function callback() {
console.log("Execute callback");
}
foo(callback);
Это setTimeout
, который откладывает выполнение и не связан с методологией обратного вызова.
Конечно, обратный вызов может использоваться в качестве обратного вызова для ответа на событие, как и
elem.addEventListener("click", callback);
. Но не только это.
Простой пример будет проиллюстрирован ниже.
Например,
var map = function(arr, callback) {
var result = [];
for (var i = 0, len = arr.length; i < len; i++) {
result.push(callback(arr[i]));
}
return result;
};
map([0, 1, 2, 3], function(item) {
return item * 2;
})
Отредактировано
Это изменение относится к
Например, если я делаю вызов из базы данных, я не знаю, сколько времени потребуется для извлечения данных. Если я попытаюсь получить к нему доступ до того, как он прибудет, я получу ошибку.
Вызов базы данных ни в коем случае не отличается от асинхронного c http-запроса. Итак, здесь я буду использовать XMLHttpRequest, чтобы продемонстрировать, как использовать обратный вызов для обеспечения этого. Но обычно это функции, предоставляемые в браузере или уже node.js. Так что вам не нужно писать это самостоятельно. Конечно, чтобы предотвратить обратный вызов, я лично предпочитаю использовать Promise
или async/await
. Но это немного из топи c.
Итак, давайте посмотрим, как XMLHttpRequest может использовать обратный вызов для обработки асинхронной c задачи.
var sendRequest = function(callback) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
callback(this);
}
};
xhttp.open("GET", "filename", true);
xhttp.send();
}
и вы можете использовать обратный вызов для обработки асин c события. Иногда вы не знаете, когда это произойдет. И основная идея о том, как это работает, основана на примере, который я сказал в ответе 1.