2016-11-20 49 views
1

全部, 我是Angular框架的初學者,並且已經閱讀$ http服務。我以爲我理解了Angular JS中的Promise對象,直到下面的問題出現在我的腦海裏。你能幫我理解嗎?

- 當我從Angular進行REST調用時,Angular在執行調用REST API的js中的其他步驟之前不會進行其他調用。這是因爲它是單線程的。好吧,我明白了。那麼它何時執行REST調用?可能是在當前JS的所有指令完成後?如果是,

  • 爲什麼我們甚至稱之爲異步?其次,在它執行REST API的時候(假設REST API產生的輸出不在2秒之前),在它調用REST API之後,Angular僅僅等待2秒而沒有做任何事情?

如果$ http服務異步只要它認爲它執行REST API,

  • 誰產卵第二線程來執行REST API?框架?如果是的話,那麼他們不再使用Javascript進行單線程?
  • 其次當服務返回,而主線程還沒有完成執行我的js中的所有行,是否Angular/jQuery去執行.then函數中編碼的指令,使指令在主線程中等待?

非常感謝您的幫助!

炳廷

+0

*「我們回答不休息呼叫」*是什麼意思?仍然是單線程的。當活動線程處理顯然 – charlietfl

+0

@charlietfl我已經更新了我的問題,現在這樣很明顯 – InfiniteLoop

+1

還應注意,這一切都不是角具體的迴應將處理......這是所有關於AJAX(的XmlHttpRequest)請求的瀏覽器處理該可以相對於大多數事件採取永恆 – charlietfl

回答

0

首先,它不會阻止執行,它立即發送請求。基本上它遵循使用回調函數概念的承諾模式。所以,只要API返回響應,就會調用回調函數並恢復進程。

沒有第二個線程這樣的概念。當HTTP返回響應時,執行不會停止。它只是調用它的回調方法,然後執行剩餘的代碼行

1

當我做從角,角工作REST調用不會使REST調用它執行從哪裏REST API調用

沒有JS的其他步驟之前,這是不正確的。它立即發送請求。但是在響應回來之前它不會阻塞,因爲這可能需要很長時間並完全凍結應用程序。相反,它會註冊一個回調,並且稍後會在響應可用時調用此回調。這是不同步的原則。

誰產卵第二線程來執行REST API

沒有第二個線程。

查看它的最簡單方法是考慮HTTP響應是一個事件,就像點擊或按鍵一樣。所有獨特的線程都是等待下一個事件並對其做出反應,然後循環。

+0

因此,如果解釋器正在執行Javascript文件中的其他行的中間,它會暫停並返回到執行回調,如果承諾對象解決? – InfiniteLoop

+0

不,HTTP響應是瀏覽器在事件隊列中發佈的事件,它將像JavaScript一樣處理其他事件。如果您的JS有一些無限循環,則不再可以處理包括HTTP響應在內的任何事件。它本身就是角色,當它執行低層次的XMLHttpRequest回調來響應接收到的響應時,解決HTTP承諾。 –