2015-09-16 160 views
-1

我有我自己的函數A,和上傳文件的第三者異步函數B,現在我想A的執行過程中調用函數B,然後等待該B功能結束。等待異步函數結束

我可以檢查函數是否由一個標誌var F完成,問題是如果我使用下面的代碼瀏覽器進入一個無限循環(也許是因爲它在循環中忙,無法更新F)。

function A(){ 
    // ... 
    B(); 
    while(F); 
    // ... 
} 

function B(){ 
    // ... 
} 

我不能在2子功能

對不起總是在一個線程分割函數的對我很差的英語

+0

_I不能將函數A拆分爲2個子函數_爲什麼不能? – Andreas

+1

這就是*承諾*的目的。如果'B'被正確地實現了,它應該返回一個promise對象,你可以用它來設置當'B'中的異步進程完成時調用的處理程序。或者,他們可能已經爲一個函數添加了一個參數,一旦完成「B」就會調用它。但是,如果'B'的實現者懶惰,他們沒有做過那樣的事情,而且你沒有太多的事情可以做。 –

回答

0

JavaScript運行。這意味着,你無法忙於等待,或者你會阻止整個劇本。你應該使用一些異步編程。像爲您的B函數提供回調或讓您的B函數返回承諾。

回調方法將是這樣的:

B(function(err, result) { 
    // some code after B completes 
}); 

功能B完成後,必須調用回調函數。

使用時的承諾,你的代碼會像:

B().then(function(result) { 
     // result handling 
    }, 
    function(err) { 
     // error handling 
    }); 

承諾是非常方便的,但需要使用一些第三方庫,因爲它們不是JS的一部分。實際上,使用承諾可能會有所不同,具體取決於庫(即承諾jqueryq

+0

'JS'的不是一個組成部分 - 除非你使用瀏覽器使用的SpiderMonkey,V8,或輪的JavaScript引擎 - 涵蓋了所有現代瀏覽器和 –

+0

我知道回調,並承諾tecniques拋出的NodeJS,但這些tecniques我應該分裂在2個子函數中的一個函數,問題是A函數太複雜並且將它分解爲2我會發送很多屬性,從第一部分到第二部分,在我的情況下,分區也會在while循環(在示例中未顯示) – davidinho