2017-01-22 6 views
0

Мне задали интересный вопрос о стеке вызовов функции, содержащей функцию async.стек функции, содержащей функцию асинхронизации

Вот пример:

function test(a) 
{ 
    call_server(“www.awebsite.com/api”, a, callback);//async 
} 

Что стек вызовов выглядеть? Мое понимание: толчка (тест) толчка (а) толчка (call_server)

, а затем: поп (call_server) попа (а) попа (тест)

Но мой вопрос, где - это позиция обратного вызова «call_server». Когда он запускается и получает выделенное пространство в стеке.

Благодаря

+0

Какой язык программирования вы используете? Где объявлена ​​функция call_server? –

+0

Что вы подразумеваете под "async function"? Как в C#? –

+0

Извините за путаницу. Это javascript. Функция Async означает, что функция выполняется асинхронно. – derek

ответ

0

Учитывая скудную информацию и по наблюдению:

  1. callback выталкивается на стеке рамки function test должны быть переданы функции call_server или он передается в регистр. Это зависит от соглашения о вызове.
  2. callback не определяется в пределах function test или передан в функцию, поэтому я предполагаю, что он определен снаружи.
  3. Скорее всего, что callback является указателем или ссылкой какого-либо определения функции функции обратного вызова.
  4. Разумно думать, зрение невидимо, что call_server захватывает ссылку или указатель на callback в локальном хранилище асинхронных потоков или в ячейке с памятью.
  5. Когда асинхронный вызов завершен, он вызывает функцию callback в контексте фрейма асинхронного стека.
  6. И наконец, callback, который, скорее всего, является функцией, устанавливает собственный стековый фрейм, чтобы делать все, что он делает.
+0

Это звучит как реализация «вилки». Вы утверждаете, что это то же самое, что и функция aync C#? –

+0

@IraBaxter OP ничего не сказал о аналогии с C#. Я отвечал на его вопрос (ы). –