2017-01-22 32 views
0

我被問到一個關於包含異步函數的函數的調用堆棧的有趣問題。包含異步函數的函數的堆棧

下面是一個例子:

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

是什麼調用堆棧是什麼樣子?我的理解是: 推(測試) 推(一) 推(call_server)

然後: 彈出(call_server) 流行(一) 流行(測試)

但我的問題是在哪裏是「call_server」回調的位置。它何時被觸發並獲得分配的堆棧空間。

由於

+0

什麼是您使用的編程語言? call_server函數在哪裏聲明? –

+0

「異步功能」是什麼意思?在C#中? –

+0

對不起,我感到困惑。這是JavaScript。異步功能意味着該功能是異步運行的。 – derek

回答

0

鑑於缺乏信息,並通過觀察:

  1. callback被推的function test堆棧幀將被傳遞到的call_server功能,或者它是在寄存器中被傳遞。這取決於調用約定。
  2. callback既沒有在function test的範圍內定義,也沒有被傳入函數,所以我認爲它是在外部定義的。
  3. callback很可能是某種指向回調函數定義的指針或引用。
  4. 這是合理的想象,看不見的,call_server捕獲的參考或指針callback在它的異步線程本地存儲或鍵控的內存位置。
  5. 當異步調用完成後,它會調用異步堆棧幀上下文中的callback函數。
  6. 最後,callback,它可能是一個函數,建立它自己的堆棧框架來做任何事情。
+0

這聽起來像是一個「fork」的實現。你是否聲稱與C#異步函數相同? –

+0

@IraBaxter OP沒有聲明任何有關C#的類比。我正在回答他的問題。 –