Javascript ';未定义';从JS模块返回对象时
我定义了一个全局变量,然后将其设置为一个方法,该方法通过我的一个模块呈现图表而可用。模块应返回一个图表,从而为变量“alChart”分配一个图表对象。还值得一提的是,使用此代码,图表呈现得非常好 图表呈现模块: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
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"
})
;