ajax调用后从Javascript模块返回值

ajax调用后从Javascript模块返回值,javascript,ajax,module-pattern,revealing-module-pattern,Javascript,Ajax,Module Pattern,Revealing Module Pattern,---编辑---由于我的无知,这实际上与所有其他AJAX类型的问题一样…需要进入正确的思维方式。为了子孙后代的缘故,把它留在这里,也许可以帮助其他人在发布之前再次查看回调 因此,我想先说,我认为这不是标准的“如何从ajax调用返回值”问题,人们不会等待异步调用完成。我认为这是对Javascript模块模式的一个可变范围的误解,因此任何指导都将不胜感激 我将继续构建ajax调用,因此在调用完成后,我将使用延迟对象来处理数据。还有一些关于Javascript模块模式的教程,如和。从外部模块中的私有模

---编辑---由于我的无知,这实际上与所有其他AJAX类型的问题一样…需要进入正确的思维方式。为了子孙后代的缘故,把它留在这里,也许可以帮助其他人在发布之前再次查看回调

因此,我想先说,我认为这不是标准的“如何从ajax调用返回值”问题,人们不会等待异步调用完成。我认为这是对Javascript模块模式的一个可变范围的误解,因此任何指导都将不胜感激

我将继续构建ajax调用,因此在调用完成后,我将使用延迟对象来处理数据。还有一些关于Javascript模块模式的教程,如和。从外部模块中的私有模块中返回值似乎相当简单——但是,我总是将myObj.root()作为未定义的。即使在我检查断点时它被定义为一个X值数组。我遗漏了什么简单的东西——任何提示?谢谢很抱歉问一个简单的问题,我对JS模块模式完全陌生,正在尝试构建自己的库

我的JS代码:

var myObj = (function(window,document,$,undefined){

  var _baseUri = 'http://example.com/',
      _serviceUri = 'services/',
      _bankId = '1234',
      _myUri = _baseUri + _serviceUri + 'objectivebanks/' + _bankId,
      _roots = [];

  function myAjax(requestURL) {
    return $.ajax({
      type: 'GET',
      url: requestURL,
      dataType: 'json',
      async: true
    });
  }

  var getRoots = function() {
    var _url = _myUri + '/objectives/roots';
    _roots = [];
    myAjax(_url).done(function(data) {
      $.each(data, function(index, nugget) {
        _roots.push(nugget);
      });
      return _roots;
    }).fail(function(xhr, textStatus, thrownError) {
      console.log(thrownError.message);
    });
  }

  return {
    roots: getRoots
  };
})(this,document,jQuery);
我的错误(来自Chrome的开发者工具控制台):

“getRoots”函数不返回任何内容。使用$.ajax(successCallback)或$.ajax.done()模式是一样的。你没有拖延任何事情。 如果没有回调、事件或承诺,您是无法做到这一点的。 回调和事件基本上是相同的,只有后者允许更好的体系结构解耦(这是一个极具争议的事实)。 承诺意味着您可以编写var x=getRoots(),并且在浏览器从服务器返回响应之前,x将是未定义的。您的应用程序必须考虑到这一点。因此,要么开始使用异步模式(回调、事件)编码,要么设计优雅地处理空/未定义值的应用程序

使用回调:

function getStuff(callback) {
    $.ajax(...).done(function(data) {
        // maybe process data?
        callback(data);
    });
}

getStuff(function(data) {
    // this is where I can use data
});
通过这种方式,您可以在一个单独的模块中编写getStuff方法,比如“DataService”,这样MVC逻辑就不会受到污染。

您的“getRoots”函数不会返回任何内容。使用$.ajax(successCallback)或$.ajax.done()模式是一样的。你没有拖延任何事情。 如果没有回调、事件或承诺,您是无法做到这一点的。 回调和事件基本上是相同的,只有后者允许更好的体系结构解耦(这是一个极具争议的事实)。 承诺意味着您可以编写var x=getRoots(),并且在浏览器从服务器返回响应之前,x将是未定义的。您的应用程序必须考虑到这一点。因此,要么开始使用异步模式(回调、事件)编码,要么设计优雅地处理空/未定义值的应用程序

使用回调:

function getStuff(callback) {
    $.ajax(...).done(function(data) {
        // maybe process data?
        callback(data);
    });
}

getStuff(function(data) {
    // this is where I can use data
});

这样,您就可以在单独的模块中编写getStuff方法,比如说“DataService”,这样MVC逻辑就不会受到污染。

好的,谢谢!很明显,我仍然对回调以及如何跨模块使用回调完全感到困惑…我会考虑/尝试更多…谢谢!好的,谢谢!很明显,我仍然对回调以及如何跨模块使用回调完全感到困惑…我会考虑/尝试更多…谢谢!