2013-05-19 61 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)