2017-10-15 37 views
0

我創建了一個返回布爾值的Javascript函數。函數中的一行代碼調用REST調用。當我編寫代碼時,我沒有意識到這個調用將會是異步的。所以,基本上,該方法始終返回「假」,當我做這樣的事情:如何正確使用一個具有異步調用的Javascript函數?

if(isDataValid()) ... 

我可以在調用函數成功函數移動的動作,但我試圖創建一個可重用的方法。我正在使用jQuery和Everest。我還沒有學到任何有關Promise的知識,而且我對回調編程還很陌生。

這裏的歸結我的方法的版本:

function isDataValid(){ 

    // Read data from Local Storage 

    // Create object from data 

    // Flag variable to capture result 
    var isValid = null; 

    restClient 
     .read('/my/url', model) 
     .done(function(response) 
      {  
       // 'Good' response, set flag to true 
       isValid = true; 
      }) 
     .fail(function(response) 
      { 
       // 'Bad' response, set flag to false 
       isValid = false; 
      }); 

    return isValid; 
} 

我應該怎麼做一個異步調用和返回真/假?

+0

你根本不行。如果堆棧的任何部分都是異步的,那麼所有的東西都必須寫入異步(通過回調或承諾)。您不能調用該函數,並期望能夠同步獲得響應。 –

+0

創建您的「可重用方法」,並從成功函數中傳遞'invalid'作爲參數。 – jdigital

回答

1

函數應該標記爲async,以便await可以在裏面使用。

由於您沒有使用回覆,我將其刪除。 如果您需要回復,那麼

var response = await restClient.read('/my/url/', model); 

您應該使用try/catch來處理錯誤。 下面是最終的結果:

async function isDataValid(){ 

    var isValid = null; 

    try { 
     await restClient.read('/my/url', model); 
     isValid = true; 
    } catch(err) { 
     isValid = false; 
    } 

    return isValid; 
} 

到底叫isDataValid你也應該在函數調用前使用await。所以它會看起來像這樣:

if(await isDataValid()) { ... } 

由於await只能使用內async函數,函數,其中isDataValid叫也應標記爲async。這樣你應該更新所有的函數調用鏈,以便與await一起使用。

+0

雖然這並沒有幫助將函數調用爲「if(isDataValid())」。 –

+0

@Felix你是對的,但將它改爲'if(await isDataValid())'將解決問題 –

+0

只有當語句處於'async'函數中時纔有效。我只是說你的建議只是解決方案的一部分。也許你想編輯你的答案,幷包括其他部分(如何調用函數)。 –