Ten przykład to JavaScript, ponieważ tam najczęściej używam wywołań zwrotnych. Chcę zrozumieć, jak działają na niskim poziomie.Czy połączenia zwrotne są zawsze asynchroniczne?
W poniższym przykładzie oczekiwałbym, że wszystko się wydarzy i "oddzwonienie" nastąpi po "kroku 3" i przed "krokiem 4." Ma to dla mnie sens, ponieważ wszystko dzieje się po jednym wątku egzekucji. Nie ma oszustwa. Jedyną rzeczą, która jest wyjątkowa, jest to, że przekazałeś funkcję innej funkcji.
function main() {
console.log("step 1");
console.log("step 2");
doSomething(myCallBack);
console.log("step 4");
}
function doSomething(f) {
accessTheDatabase(); // this could take a while
console.log("step 3");
f(); // done - now call back
}
function myCallBack() {
console.log("calling back!");
}
Jak byś zrobić doSomething
asynchroniczny tak, że „krok 4” może być wykonywane przed lub równolegle z „etap 3”?
Zakładam, że gdyby doSomething
było asynchronicznie nazwane, musiałoby to dotyczyć innego wątku, nie? A jeśli tak, kiedy kończy się, a następnie wywołuje myCallBack
, , czy wywołanie zwrotne ma miejsce w drugim wątku lub w głównym wątku? Jeśli dzieje się to w głównym wątku, dlaczego drugi wątek potrzebuje nawet wskaźnika do funkcji zwrotnej? Jak działa połączenie między wątkami?
Zakładam, że to * nie * działa w przeglądarce, prawda? Ponieważ w przeglądarce każde wywołanie AJAX jest z konieczności asynchroniczne ... –
@Dean, przede wszystkim żądania XHR mogą być synchroniczne (w zależności od parametrów żądania). Po drugie, jeśli przeczytasz pytanie (i spojrzysz na jego przykładowy kod), nie chodzi o Ajax. – eyelidlessness
@ Dean może być uruchomiony w przeglądarce lub nie. Najbardziej interesuje mnie ustalenie, czy funkcja wywołania zwrotnego jest wykonywana w wątku głównym, czy w drugim wątku, który został przekazany jako wskaźnik funkcji wywołania zwrotnego. –