2013-05-19 155 views
0

我有一些JavaScript代碼從2個來源中提取數據。使異步方法同步javascript

第一源是本地的web存儲

第二源是AJAX請求。

的條件很簡單:

function getMyData(){ 
    if (window.localStorage['myData'] != null) 
    { 
     return window.localStorage['myData']; 
    } 
    else 
    { 
     networkTools.ajax("geyMyData", function (data) 
     { 
      return data; 
     }) 
    }} 

但問題是,AJAX異步是過程,我不想要的代碼將持續到getMyData()回報。

我知道我可以使用回調函數,但只希望等到這個函數返回一些東西然後繼續執行。 (不僅對於這種情況,而且對於一般知識。)

這可能嗎?

+0

什麼是'networkTools'? –

+0

networkTools只是我的包裝類jquery ajax – jekcom

+3

對不起,你需要使用回調。儘管承諾可以使這更容易。 – SLaks

回答

2

使用回叫

function getMyData(callback){ 
     if (window.localStorage['myData'] != null) 
     { 
      callback(window.localStorage['myData'];) 
     } 
     else 
     { 
      networkTools.ajax("geyMyData", function (data) 
      { 
       callback(data); 
      }) 
     } 
    } 

如何調用getMyData

getMyData(function(data){ 
     //your code 
}); 

或者你可以讓你的Ajax請求的同步請求。

1

做到這一點的最好方法是使用回調函數。

您不希望您的JavaScript阻止網絡請求等事情,因爲您的網頁將完全無響應。

這是你會怎麼做:

function getMyData(callback){ 
    if (window.localStorage['myData'] != null) 
    { 
     return window.localStorage['myData']; 
    } 
    else 
    { 
     networkTools.ajax("geyMyData", function (data) 
     { 
      callback(data); 
     }); 
    } 
} 
0

最好的辦法是打電話getMyData有一個回調,打破你的函數成來電者 - > getMyData - >回調。可以進行同步請求,但最好不要,因爲它會鎖定瀏覽器,直到完成調用。

function gotData(data){ 
    console.log("got data:",data); 
} 
function someFunction(){ 
... 
getMyData(gotData); 
} 
    function getMyData(callback){ 
    if (window.localStorage['myData'] != null) 
    { 
     callback(window.localStorage['myData']); 
    } 
    else 
    { 
     networkTools.ajax("geyMyData", function (data) 
     { 
      callback(data); 
     }) 
    }} 

我並沒有包括如何做一個同步請求,因爲它是不好做,但如果你真的想這樣做,不是如何可以找到任何地方(如MDN developer.mozilla.org/en- US/docs/DOM/XMLHttpRequest)