Javascript ';未定义';从JS模块返回对象时

Javascript ';未定义';从JS模块返回对象时,javascript,jquery,global-variables,revealing-module-pattern,Javascript,Jquery,Global Variables,Revealing Module Pattern,我定义了一个全局变量,然后将其设置为一个方法,该方法通过我的一个模块呈现图表而可用。模块应返回一个图表,从而为变量“alChart”分配一个图表对象。还值得一提的是,使用此代码,图表呈现得非常好 图表呈现模块: var ChartRendererGateway = (function ($, Highcharts) { "use strict"; //Private variables var chart; var result; //Private methods var success

我定义了一个全局变量,然后将其设置为一个方法,该方法通过我的一个模块呈现图表而可用。模块应返回一个图表,从而为变量“alChart”分配一个图表对象。还值得一提的是,使用此代码,图表呈现得非常好

图表呈现模块:

var ChartRendererGateway = (function ($, Highcharts) {

"use strict";

//Private variables
var chart;
var result;

//Private methods
var success = function (data, textStatus, jqXHR) {

    var seriesObject = $.parseJSON(data);
    result = seriesObject;

};

var fail = function () {

    errorController.showError("Something went wrong when trying to load the chart data")

};

var drawChart = function (renderTo, options) {
    options.chart.renderTo = renderTo;
    options.series = result;
    chart = new Highcharts.Chart(options);
};

//Public methods
return {

    render: function (renderTo, promise, options) {

        promise.then(success, fail)
            .done(function () {
                drawChart(renderTo, options);
            })
            .fail(function () {
                errorController.showError("Something went wrong fetching chart data!");
            });

        return chart; //Chart object exists here, but is undefined when inspecting variable it is assigned to in the .ready function
    },

    destroy: function(chartName){
        chartName.destroy();
    }
};

})(jQuery, Highcharts);
.ready():


我以前在jQuery承诺方面做得不多,但我在这方面有过尝试。要链接值,我认为您需要在jQuery的每个步骤中创建新的承诺(如果您这样做了.then().then(),那么您将在每个步骤中返回相同的数据,而不是从上一个.then()返回的数据)。因此,每当您需要新数据,并且它正在处理异步事务时,如果您正在更改数据,并且希望进一步更改数据,那么您需要创建一个新的承诺,从每次开始进行链接

这是一个如何以基本形式实现目标的示例:

function doSomething() {
  var deferred = jQuery.Deferred();  

  // Asynchronous action
  setTimeout(function() {    
    deferred.resolve("some data");
  }, 1000);

  return deferred.promise();
}

function doSomethingElse() {
  var deferred = jQuery.Deferred();

  // Has to wait for asynchronous action
  doSomething()
    .then(function(data) {
      console.log(data); // Should be "some data"

      deferred.resolve(data + " that's been added to");
    })
  ;

  return deferred.promise();
}

// Waits for everything to be done that's above, then console.logs end result
doSomethingElse()
  .then(function(data) {
    console.log(data); // Should be "some data that's been added to"
  })
;

你可以在这里看到这一点:

啊,好的。有没有关于我如何修改我的承诺以获得我想要的结果的建议?
function doSomething() {
  var deferred = jQuery.Deferred();  

  // Asynchronous action
  setTimeout(function() {    
    deferred.resolve("some data");
  }, 1000);

  return deferred.promise();
}

function doSomethingElse() {
  var deferred = jQuery.Deferred();

  // Has to wait for asynchronous action
  doSomething()
    .then(function(data) {
      console.log(data); // Should be "some data"

      deferred.resolve(data + " that's been added to");
    })
  ;

  return deferred.promise();
}

// Waits for everything to be done that's above, then console.logs end result
doSomethingElse()
  .then(function(data) {
    console.log(data); // Should be "some data that's been added to"
  })
;