2016-07-24 24 views
1

標題是很長的問題,但如果我在JavaScript中進行異步調用,但沒有回調或將其鏈接到承諾它會完成執行?即如果我有這樣的代碼:JS(node.js) - 如果我進行異步調用,但不等待它完成,它將保證完成執行?

function markAsInactive(userId) { 
    return retrieveUser(userId) // 
    .then(res => { 
     const mark = markAsInactive(userId) // returns a promise (say takes 2 seconds) 
     return Promise.resolve('blah') 
    }) 
    .then(...etc) 
    .catch(...) 
} 

markAsInactive呼叫被激發,但線程不等待它來解決,而是將移動到立即下一個then(我的理解)。它會保證完成執行,否則如果堆棧返回到根目錄,線程/進程是否會取消該調用?

我知道我可以使用像return Promise.all([mark, ...])有多個承諾並行解決;這個問題更多的是爲了我的薰陶。

+0

認爲它是這樣的:一旦請求是成功(例如發送到服務器),無論您是否等待響應都無關緊要,請求已發送並且服務器將完成必須執行的操作,並且只有在此之後它纔會嘗試響應結果。通過不「等待」它完成,你根本沒有抓住迴應。 – Cristy

+0

例如,如果您的計算機崩潰或流星襲擊地球,它不會完成。 – 2016-07-24 13:01:33

回答

2

會保證完成執行,否則如果堆棧返回根目錄,線程/進程是否會取消調用?

它完成呼叫。 全部異步操作在進一步完成它們之前最終退出當前作業(任務),完全退出堆棧;它是給定線程上的job-based nature of JavaScript的固有內容(並且NodeJS使用單個線程),並且承諾回調保證是異步的。

如果之前終止了的NodeJS所做的工作將不會完成,但同時有任何未完成的任務,I/O操作等不斷的NodeJS運行