制作异步方法同步javascript

时间:2013-05-19 13:33:52

标签: javascript

我有一些JavaScript代码可以从两个来源中提取数据。

第一个来源是本地网络存储

第二个来源是AJAX请求。

条件很简单:

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

但问题是AJAX是异步进程,我不希望代码在getMyData()返回之前继续。

我知道我可以使用回调,但是只想等到这个函数返回一些东西然后继续执行。 (不仅是这种情况,而且是一般知识。)

这可能吗?

3 个答案:

答案 0 :(得分: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 :(得分:1)

执行此操作的最佳方法是使用回调函数。

您不希望JavaScript阻止网络请求之类的内容,因为您的网页会完全无法响应。

这就是你要做的:

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

答案 2 :(得分: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的)