我试图通过_fail回调返回一个对象(是的,这是为了运行失败回调),但是failSeries在控制台中以未定义的形式返回。有什么想法吗?
var ChartModule = (function ( $, HC, HA, window, undefined) {
//Define public object
var pub = {};
//Private methods
var _getChartData = function (URL, sendData) {
var xhrObject = $.ajax({
url: URL,
type: "POST",
data: sendData,
success: function (result) { },
error: function (jqXHR, textStatus, errorThrown) {}
});
_chartDataResponse(xhrObject);
};
var _done = function (data, textStatus, jqXHR) {
var seriesObject = $.parseJSON(data);
return seriesObject;
};
var _fail = function(){
var failSeries = [];
var seriesData = {
data: [{y: 7, id: 'pointAssets', color: '#5c8fb8'}, {y:10, id: 'pointLiabilities', color: '#bb77b5'}, {y:-3, id: 'pointResult', color: '#cc5971'}],
};
failSeries.push(seriesData);
return failSeries;
};
var _chartDataResponse = function(xhrObject){
xhrObject.then(_done, _fail);
};
var _renderChart = function(renderTo, seriesObject){
console.log("Chart will be rendered to: '" + renderTo + "'");
console.log(seriesObject);
};
//Public methods
pub.getChartData = _getChartData;
pub.renderChart = _renderChart;
return pub;
})(jQuery, Highcharts, HighchartsAdapter, window, undefined);
然后我按照以下方式使用我的模块,试图查看成功或失败的callabcks返回的对象:
$(function(){
var x = ChartModule.getChartData("someURL", {test: "test"});
ChartModule.renderChart("breakdown-chart", x);
});
答案 0 :(得分:0)
我试图通过_fail回调返回一个对象(是的,这是为了运行失败回调)。 然后我按以下方式使用我的模块,试图查看成功或失败的callabcks返回的对象:
没有。 You can't do that。回调不会返回任何内容。请参阅How do I return the response from an asynchronous call?。
但是failSeries在控制台中以未定义的形式返回。
因为failSeries
是_fail
函数的本地变量,并且从中返回任何内容。
有什么想法吗?
回报承诺。然后等到它结算,然后再调用renderChart
(来自回调)。
var ChartModule = (function( $, HC, HA, window, undefined) {
function getChartData(URL, sendData) {
return $.ajax({
url: URL,
type: "POST",
data: sendData
}).then(done, fail);
}
function done(data, textStatus, jqXHR) {
return $.parseJSON(data);
}
function fail() {
// ignore errors, continue with fake data
return new $.Deferred().resolve([
{data: [{y: 7, id: 'pointAssets', color: '#5c8fb8'}, {y:10, id: 'pointLiabilities', color: '#bb77b5'}, {y:-3, id: 'pointResult', color: '#cc5971'}]}
]);
}
function renderChart(renderTo, seriesObject){
console.log("Chart will be rendered to: '" + renderTo + "'");
console.log(seriesObject);
}
return {
getChartData: getChartData,
renderChart: renderChart
};
})(jQuery, Highcharts, HighchartsAdapter, window, undefined);
$(function(){
ChartModule.getChartData("someURL", {test: "test"}).then(function(x) {
ChartModule.renderChart("breakdown-chart", x);
});
});
答案 1 :(得分:0)
稍微更好地理解(和使用)$ .ajax(),ChartModule
将减少到更少的公共方法。特别是:
$ajax()
会返回一个承诺,该承诺可以(并且应该)由getChartData()
返回,从而允许在外部采取成功/失败的后续行动。then()
内的getChartData()
链接中使用适当的低级别错误处理,您可以在调用ChartModule.getChartData()
时发出错误消息和假系列数据。var ChartModule = (function ( $, HC, HA, window, undefined) {
//Private members
var fakeSeriesData = { data: [{y: 7, id: 'pointAssets', color: '#5c8fb8'}, {y:10, id: 'pointLiabilities', color: '#bb77b5'}, {y:-3, id: 'pointResult', color: '#cc5971'}] };
function _getChartData(URL, sendData) {
return $.ajax({
url: URL,
type: "POST",
data: sendData,
dataType: 'json'
}).then(null, function (jqXHR, textStatus, errorThrown) {
var e = new Error(textStatus);
e.seriesData = getFakeSeriesData();
return e; //return an augmented Error object.
});
}
function _renderChart(renderTo, seriesObject) {
console.log("Chart will be rendered to: '" + renderTo + "'");
console.dir(seriesObject);
return ...;//something meaningful
}
function _getFakeSeriesData() {
return $.extend({}, fakeSeriesData);
}
//Public methods
return {
getChartData: _getChartData,
renderChart: _renderChart,
getFakeSeriesData: _getFakeSeriesData//make the fake series data directly availalbe.
};
})(jQuery, Highcharts, HighchartsAdapter, window, undefined);
这个策略允许在调用ChartModule.getChartData()
的地方执行控制,不假设可以对AJAX的成功或失败采取什么操作,除了错误之外,使假系列数据可用知道如何/是否将被使用。
请致电如下:
$(function() {
ChartModule.getChartData("someURL", {
test: "test"
}).done(function(seriesData) {
ChartModule.renderChart("breakdown-chart", seriesData);
}).fail(function(error) {
if(error.seriesData) {
console.log(error.message);
ChartModule.renderChart("breakdown-chart", error.seriesData);
} else {
console.error(error);
//some othe couse of action
}
});
});
在代码中的某个其他位置,您可以调用ChartModule.getChartData()
并采取完全不同的操作作为响应。你可能会出错,甚至注入一些其他假的seriesData,无论出于什么原因,这些都比默认更合适。