【问题标题】:Make Asynchronous method Synchronous javascript使异步方法同步javascript
【发布时间】:2013-05-14 03:58:58
【问题描述】:

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

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

第二个来源是 AJAX 请求。

条件很简单:

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

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

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

这可能吗?

【问题讨论】:

  • networkTools 是什么?
  • networkTools 只是我的 jquery ajax 包装类
  • 对不起;你需要使用回调。不过,Promise 可以让这一切变得更容易。
  • 如果您不喜欢传递回调,那么您可以使用中介模式并引发 dataReceived 事件,该事件将触发任何监听它的函数。 addyosmani.com/resources/essentialjsdesignpatterns/book
  • @jekcom 所以你将一个长一个字母的函数“包装”到networkTools 中?酷 :D 无论如何,您可以使用 promises,如前所述。

标签: javascript


【解决方案1】:

最好的选择是使用回调调用 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)

【讨论】:

    【解决方案2】:

    最好的方法是使用回调函数。

    您不希望您的 JavaScript 阻止诸如网络请求之类的事情,因为您的网页会变得完全没有响应。

    你会这样做:

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

    【讨论】:

      【解决方案3】:

      使用回调

          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 请求作为同步请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 2013-10-16
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多